在官方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”答案 0 :(得分:0)
这来自于为{em> JVM 实现Integer.valueOf(int)
的方式:
此方法将始终缓存-128到127(包括端点)范围内的值,并可以缓存此范围之外的其他值。
因此,对于a = 127
,标识box1 === box2
始终成立,而对于所有非byte
值,它可能不成立。