平等在Kotlin

我正在学习Kotlin,拥有C ++和Java背景。 我期待以下打印true ,而不是false 。 我知道==映射到equalsequals的默认实现是否不比较每个成员,即firstNamelastName ? 如果是这样,它不会看到字符串值相等(因为==地图再次equal )? 显然有一些与平等与身份相关的东西,我还没有在科特林的权利。

 class MyPerson(val firstName: String, val lastName: String) fun main(args: Array<String>) { println(MyPerson("Charlie", "Parker") == MyPerson("Charlie", "Parker")) } 

默认情况下,您所描述的实现只存在于数据类中。 不适用于从Object继承实现的常规类,只需使该对象等于它自己。

Java的

在Java中, equals的默认实现比较变量的引用 ,这就是== 总是这样做的:

Object类的equals方法实现对象上最可能的等价关系; 也就是说,对于任何非null的引用值x和y,当且仅当x和y引用同一个对象(x == y的值为true)时,此方法返回true。

我们称之为“ 参照平等”。

科特林

除Java之外,Kotlin的==被编译为equals ,而===与Java的==

每当我们想要“ 结构化 ”而不是“引用”的平等时,我们可以重写equals ,这对于普通的类来说是不会默认的。 但是,在Kotlin中,我们可以使用data class ,它自动为我们提供一个实现:)

顺便说一句 :总是记住重写hashCode每当你做手动覆盖equals (反之亦然),坚持两个方法的非常严格的合同 。 Kotlin编译器生成的实现也是这样做的。 不用担心这里

==平等

在Java中,您可以使用==比较原始类型和引用类型。 如果应用于基本类型,Java的==比较值,而引用类型上的==比较引用。 因此,在Java中,有一个众所周知的总是调用equals的习惯,还有一个众所周知的忘记这样做的问题。

在Kotlin中,==是比较两个对象的默认方式:它通过在引擎盖下调用equals比较它们的值。 因此,如果在您的类中重写equals,则可以安全地使用==比较其实例。 对于参考比较,您可以使用===运算符,它与Java中的==完全相同。

 class MyPerson(val firstName: String, val lastName: String){ override fun equals(other: Any?): Boolean { if (other == null || other !is MyPerson) return false return firstName == other.firstName && lastName == other.lastName } } fun main(args: Array<String>) { println(MyPerson("Charlie", "Parker") == MyPerson("Charlie", "Parker")) // print "true" } 

在你的情况MyPerson是用来自动生成通用方法( toStringequalshashCode )的实现的data class