在Kotlin中,两个比较运算符==
和===
有什么区别?
class A {
var foo = 1
}
var a1 = A()
var a2 = A()
println(a1 == a2) // output false
println(a1 === a2) // output false
a1 = a2
println(a1 == a2) // output true
println(a1 === a2) // output true
答案 0 :(得分:3)
简而言之,来自the docs:
在科特林,平等有两种类型:
equals()
)=> ==
===
详细答案:
==
) ==
的取反的对象是!=
按照惯例,像a == b
这样的表达式将被翻译为:
a?.equals(b) ?: (b === null)
如果a
不是null
,它将调用equals(Any?)
函数,否则它将检查b
在引用上是否等于null
。
要提供自定义的等价检查实现,请覆盖equals(other: Any?): Boolean
函数。具有相同名称和其他签名的函数(例如equals(other:Foo))不影响使用运算符==
和!=
进行的相等性检查。
===
) ===
的取反的对象是!==
a === b
和true
指向同一个对象时, a
的值为b
。对于在运行时表示为原始类型的值(例如Int
),===
相等性检查等同于==
检查。
让我们假设A
的定义与您在问题中的定义相同。
>>> 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
继承的,只需使对象与其自身相等即可。
>>> var a1 = A()
>>> var a2 = A()
>>> a1 = a2
>>> a1 == a2
true
>>> a1 === a2
true
a1
和a2
指向同一对象,这就是a1 == a2
和a1 === a2
返回true的原因。
让我们覆盖equals(Any?)
中的A
如下:
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
在结构上是相等的,即使它们引用了不同的对象。
答案 1 :(得分:1)
在Kotlin中,可以使用两种类型的相等性。它们是:结构平等和引用平等。
class A {
var foo = 1
}
var a1 = A()
var a2 = A()
a1
和a2
是类A
的两个实例。
println(a1 == a2)
它打印false
是因为a1
和a2
在结构上不相等。
println(a1 === a2)
因为false
和a1
没有引用同一对象,所以它打印a2
。
但是,如果执行以下行:a1 = a2
,
a1和a2在结构上相等,并且a1引用a2实例。这就是为什么,
println(a1 == a2)
println(a1 === a2)
这两行都返回true。