相等性
Kotlin 中有两类相等性:
- 结构相等(
==
——用equals()
检测); - 引用相等(
===
——两个引用指向同一对象)。
结构相等
结构相等由 ==
以及其否定形式 !=
操作判断。 按照约定,像 a == b
这样的表达式会翻译成:
a?.equals(b) ?: (b === null)
如果 a
不是 null
则调用 equals(Any?)
函数,否则(a
是 null
)检测 b
是否与null
引用相等。
请注意,当与 null
显式比较时完全没必要优化你的代码: a == null
会被自动转换为 a === null
。
如需提供自定义的相等检测实现,请覆盖 equals(other: Any?): Boolean 函数。 名称相同但签名不同的函数,如 equals(other: Foo)
并不会影响操作符 ==
与 !=
的相等性检测。
结构相等与 Comparable<……>
接口定义的比较无关,因此只有自定义的 equals(Any?)
实现可能会影响该操作符的行为。
引用相等
引用相等由 ===
(以及其否定形式 !==
)操作判断。a === b
当且仅当 a
与 b
指向同一个对象时求值为 true。对于运行时以原生类型表示的值 (例如 Int
),===
相等检测等价于 ==
检测。
浮点数相等性
当相等性检测的两个操作数都是静态已知的(可空或非空的)Float
或 Double
类型时,该检测遵循 IEEE 754 浮点数运算标准。
否则会使用不符合该标准的结构相等性检测,这会导致 NaN
等于其自身,认为 NaN
比包括 POSITIVE_INFINITY
在内的任何其他元素都大, 而 -0.0
不等于 0.0
。
更多信息请参见浮点数比较。
数组相等性
如需比较两个数组是否具有相同顺序的相同元素,请使用 contentEquals()。
更多信息请参见比较数组。