【问题标题】:What is difference between == and === in kotlinkotlin 中 == 和 === 有什么区别
【发布时间】:2018-12-22 17:58:03
【问题描述】:

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 equality-operator


【解决方案1】:

简单来说,来自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 返回 true。

片段 3

让我们覆盖A 中的equals(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 在结构上是相等的,即使它们引用了差异对象。

【讨论】:

    【解决方案2】:

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

    class A {
      var foo = 1
    }
    
    var a1 = A()
    var a2 = A()
    

    这里a1a2A 类的两个实例。

    println(a1 == a2)
    

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

    println(a1 === a2)
    

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

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

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

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

    这两行都返回 true。

    【讨论】:

    • 为什么a1a2 在结构上不相等?
    猜你喜欢
    • 2019-08-19
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 2019-11-13
    相关资源
    最近更新 更多