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()
这里 a1
和 a2
是 class A
.
的两个实例
println(a1 == a2)
它打印 false
因为 a1
和 a2
在结构上不相等。
println(a1 === a2)
它打印 false
因为 a1
和 a2
没有引用同一个对象。
但是,如果您执行此行: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) ,不会影响与运算符 ==
和 !=
.
的相等性检查
引用相等(===
)
===
的否定对应是!==
当且仅当 a
和 b
指向同一个对象时,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
a1
和 a2
指向同一个对象,这就是为什么 a1 == a2
和 a1 === a2
return 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
请注意 a1
和 a2
在结构上是相同的,即使它们引用了不同的对象。
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()
这里 a1
和 a2
是 class A
.
println(a1 == a2)
它打印 false
因为 a1
和 a2
在结构上不相等。
println(a1 === a2)
它打印 false
因为 a1
和 a2
没有引用同一个对象。
但是,如果您执行此行: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) ,不会影响与运算符 ==
和 !=
.
引用相等(===
)
===
的否定对应是!==
a
和 b
指向同一个对象时,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
a1
和 a2
指向同一个对象,这就是为什么 a1 == a2
和 a1 === a2
return 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
请注意 a1
和 a2
在结构上是相同的,即使它们引用了不同的对象。