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

Ser*_*rev 7 equality-operator 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
Run Code Online (Sandbox Code Playgroud)

Avi*_*kar 8

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

class A {
  var foo = 1
}

var a1 = A()
var a2 = A()
Run Code Online (Sandbox Code Playgroud)

这里a1a2是 class 的两个实例A

println(a1 == a2)
Run Code Online (Sandbox Code Playgroud)

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

println(a1 === a2)
Run Code Online (Sandbox Code Playgroud)

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

但是,如果你执行这一行:a1 = a2那么,

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

println(a1 == a2)
println(a1 === a2)
Run Code Online (Sandbox Code Playgroud)

这两行都返回true。

  • 这个答案是不完整的。它介绍了两个运算符返回相同值的两种情况。展示它们不同的案例会更有趣。 (7认同)
  • 为什么“a1”和“a2”在结构上不相等? (4认同)

lmi*_*asf 7

简而言之,来自文档

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

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

详细解答:

结构平等 ( ==)

的否定对应物==!=

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

a?.equals(b) ?: (b === null)
Run Code Online (Sandbox Code Playgroud)

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

要提供自定义 equals 检查实现,请覆盖该equals(other: Any?): Boolean函数。具有相同名称和其他签名的函数,例如 equals(other: Foo) ,不会影响运算符== and 的相等性检查!=

参照平等 ( ===)

的否定对应物===!==

a === b评估为true当且仅当ab 指向同一个对象。对于在运行时表示为原始类型的值(例如,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
Run Code Online (Sandbox Code Playgroud)

对于常规类, 的实现equals是从 继承的Any,并且只是使对象等于自身。

片段 2

>>> var a1 = A()
>>> var a2 = A()
>>> a1 = a2 
>>> a1 == a2
true
>>> a1 === a2
true
Run Code Online (Sandbox Code Playgroud)

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
    }
}
Run Code Online (Sandbox Code Playgroud)

现在让我们运行以下命令:

>>> var a1 = A()
>>> var a2 = A()
>>> a1 == a2
true
>>> a1 === a2
false
Run Code Online (Sandbox Code Playgroud)

请注意,即使它们引用不同的对象,a1并且a2在结构上也是相等的。