Kotlin对“字节”数字的引用相等

时间:2018-06-01 12:45:35

标签: kotlin equality

在官方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”

1 个答案:

答案 0 :(得分:0)

这来自于为{em> JVM 实现Integer.valueOf(int)的方式:

  

此方法将始终缓存-128到127(包括端点)范围内的值,并可以缓存此范围之外的其他值。

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