Kotlin 有两种类型的相等比较:
- 引用相等(Referential equality)- 指向同一个对象
- 结构相等(Structural equality)- 通过
equals()
来检查
结构相等通过 ==
操作符来判断(否定形式是 !=
)。按照惯例,像 a == b
这样的表达式会被转换成:
a?.equals(b) ?: (b === null)
如果 a
不为 null
,equals(Any?)
会被调用,否则(a
是 null
)会检查 b
跟 null
是否是引用相等。
注意,当与 null
做显示对比时优化代码没有意义,因为 a == null
会被自动转换成 a === null
。
当相等比较的操作数确定是 Float
或者 Double
类型时(可为空),比较操作遵循浮点运算的 IEEE 754 标准。
否则使用结构相等,这种方式与规范不符,因为 NaN
等于它自己,-0.0
不等于 0.0
。
引用相等通过 ===
操作来判断(否定形式是 !==
)。a === b
为 true 的唯一条件是 a
和 b
指向同一个对象。