简单来说,来自the docs:
在 Kotlin 中有两种相等类型:
- 结构相等(检查
equals())=> ==
- 引用相等(两个引用指向同一个对象)=>
===
详细回答:
结构平等 (==)
== 的否定对应物是!=
按照惯例,a == b 之类的表达式被翻译为:
a?.equals(b) ?: (b === null)
如果a 不是null,则调用equals(Any?) 函数,否则检查b 是否在引用上等于null。
要提供自定义的等号检查实现,请覆盖equals(other: Any?): Boolean 函数。具有相同名称和其他签名的函数,例如 equals(other: Foo) ,不会影响运算符 == 和 != 的相等性检查。
参照平等 (===)
=== 的否定对应物是!==
当且仅当a 和b 指向同一个对象时,a === b 的计算结果为 true。对于在运行时表示为原始类型的值(例如,Int),=== 相等检查等效于 == 检查。
代码说明
假设A 的定义与您在问题中定义的一样。
片段 1
>>> var a1 = A()
>>> var a2 = A()
>>> a1 == a2 // a1 and a2 are different instances of A
false
>>> a1 == a1
true
>>> a2 == a2
true
>>> a1 === a2 // a1 and a2 have references to different objects
false
对于普通类,equals的实现继承自Any,只是让对象和自己相等。
片段 2
>>> var a1 = A()
>>> var a2 = A()
>>> a1 = a2
>>> a1 == a2
true
>>> a1 === a2
true
a1 和 a2 指向同一个对象,这就是为什么 a1 == a2 和 a1 === a2 返回 true。
片段 3
让我们覆盖A 中的equals(Any?),如下所示:
class A {
var foo = 1
override fun equals(other: Any?): Boolean {
if (other == null || other !is A)
return false
return foo == (other as A).foo
}
}
现在让我们运行以下命令:
>>> var a1 = A()
>>> var a2 = A()
>>> a1 == a2
true
>>> a1 === a2
false
请注意,a1 和 a2 在结构上是相等的,即使它们引用了差异对象。