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

What is difference between == and === in kotlin

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

在 Kotlin 中,有两种类型的相等性可用。它们是:结构平等 & 参照平等.

class A {
  var foo = 1
}

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

这里 a1a2 是 class A.

的两个实例
println(a1 == a2)

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

println(a1 === a2)

它打印 false 因为 a1a2 没有引用同一个对象。

但是,如果您执行此行:a1 = a2 那么,

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

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

这两行returns正确。

简而言之,来自the docs

在 Kotlin 中有两种类型的相等:

  • 结构相等(检查 equals())=> ==
  • 引用相等(两个引用指向同一个对象)=> ===

详细答案:

结构平等(==

==的否定对应是!=

按照惯例,像 a == b 这样的表达式被翻译成:

a?.equals(b) ?: (b === null)

如果 a 不是 null,它调用 equals(Any?) 函数,否则它检查 b 引用等于 null

提供自定义相等检查实现重写 equals(other: Any?): Boolean 函数。具有相同名称和其他签名的函数,如 equals(other: Foo) ,不会影响与运算符 ==!=.

的相等性检查

引用相等(===

===的否定对应是!==

当且仅当 ab 指向同一个对象时,

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

a1a2 指向同一个对象,这就是为什么 a1 == a2a1 === a2 return true.

片段 3

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

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