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
4条答案
按热度按时间kx7yvsdv1#
简单来说,从the docs:
在Kotlin有两种类型的平等:
equals()
)=〉==
===
详细答案:
结构相等(
==
)==
的求反对应项为!=
按照约定,类似
a == b
的表达式将转换为:如果
a
不是null
,则它调用equals(Any?)
函数,否则它检查b
是否参考地等于null
。equals(other: Any?): Boolean
函数。具有相同名称和其他签名的函数,如等于(其他:Foo),则不影响使用运算符==
和!=
进行的相等性检查。引用相等(
===
)===
的求反对应项为!==
当且仅当
a
和b
指向同一对象时,a === b
才计算为true
。对于在运行时表示为基元类型的值(例如Int
),===
相等性检查等效于==
检查。代码说明
让我们假设
A
的定义与您在问题中定义的相同。代码段1
对于常规类,
equals
的实现是从Any
继承的,并且只是使对象等于其自身。代码段2
a1
和a2
指向同一对象,这就是a1 == a2
和a1 === a2
返回true的原因。片段3
让我们重写
A
的equals(Any?)
,如下所示:现在让我们运行以下代码:
请注意,
a1
和a2
在结构上是相等的,尽管它们引用了差异对象。v09wglhw2#
在Kotlin中,有两种类型的等式可用,它们是:结构平等和参照平等。
这里
a1
和a2
是类A
的两个示例。它打印
false
,因为a1
和a2
在结构上不相等。它打印
false
,因为a1
和a2
没有引用同一个对象。但是,如果执行以下代码行:
a1 = a2
那么,a1和a2在结构上是相同的,a1引用了a2示例,这就是为什么
这两行都返回真。
zzwlnbp83#
结构平等意味着内容应该相同
引用相等意味着两个示例应指向同一指针。
您可以覆盖equals()并执行以下操作。
让我们测试一下。
第1行打印"true"
第2行打印"false"
第1行打印"true"
第2行打印"true"
最后,
===总是检查引用是否相等,而==检查等效内容,并且基于您的实现。
7jmck4yq4#
Kotlin==和===运算符(全新外观:6例)
在Kotlin中,如果a和B代表两个变量,那么println(a==b)检查这两个值在结构上是否相等,而println(a===b)检查a和b是否具有相同的引用,下面的例子可以说明这一点。