Kotlin中==和===有什么区别

时间:2018-07-14 14:58:19

标签: kotlin equality-operator

在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

2 个答案:

答案 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 === btrue指向同一个对象时,

a的值为b。对于在运行时表示为原始类型的值(例如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

a1a2指向同一对象,这就是a1 == a2a1 === a2返回true的原因。

摘要3

让我们覆盖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

请注意,a1a2在结构上是相等的,即使它们引用了不同的对象。

答案 1 :(得分:1)

在Kotlin中,可以使用两种类型的相等性。它们是:结构平等引用平等

class A {
  var foo = 1
}

var a1 = A()
var a2 = A()

a1a2是类A的两个实例。

println(a1 == a2)

它打印false是因为a1a2在结构上不相等。

println(a1 === a2)

因为falsea1没有引用同一对象,所以它打印a2

但是,如果执行以下行:a1 = a2

a1和a2在结构上相等,并且a1引用a2实例。这就是为什么,

println(a1 == a2)
println(a1 === a2)

这两行都返回true。