"Byte"数的 Kotlin 引用相等性



在 Kotlin 官方参考 https://kotlinlang.org/docs/reference/basic-types.html#numbers 中,我读到:

请注意,数字装箱并不一定保留身份

以及显示如何表示它的示例:

val a: Int = 10000
print(a === a) // Prints 'true'
val boxedA: Int? = a
val anotherBoxedA: Int? = a
print(boxedA === anotherBoxedA) // !!!Prints 'false'!!!

经过一些自发的测试,我意识到它应该对字节数(<128(工作:

val a = 127
val boxedA: Int? = a
val anotherBoxedA: Int? = a
print(boxedA === anotherBoxedA) //!!!Prints 'true'!!!

同样在同一参考 https://kotlinlang.org/docs/reference/equality.html 中,我发现:

对于在运行时表示为基元类型的值(例如 Int(,=== 相等性检查等效于 == 检查

但这并不能解释这种情况:

val a = 128
val boxedA: Int? = a
val anotherBoxedA: Int? = a
print(boxedA === anotherBoxedA) //!!!Prints 'false'!!!

所以我试图得到一个胶水,为什么引用等式"==="对数字>=128 显示"false",对 <128 显示"true"?

这来自JVMInteger.valueOf(int)实现方式:

此方法将始终缓存 -128 到 127(含(范围内的值,并可能缓存此范围之外的其他值。

因此,对于a = 127,恒等box1 === box2始终成立,而对于所有非byte值,则可能不成立。

最新更新