首页 > 解决方案 > “字节”数字的 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显示“假”而为<128显示“真”?

标签: kotlinequality

解决方案


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

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

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


推荐阅读