kotlin - “字节”数字的 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显示“真”?
解决方案
这来自于JVMInteger.valueOf(int)
的实现方式:
此方法将始终缓存 -128 到 127(含)范围内的值,并且可能缓存此范围之外的其他值。
因此,a = 127
对于恒等式box1 === box2
始终成立,而对于所有非byte
值,它可能不成立。
推荐阅读
- javascript - 如何在相应的滚动上获得虚线(带有向下箭头图标)SVG动画?
- graphics - mac中的计算机图形学
- database - UnicodeDecodeError:“ascii”编解码器无法解码机器人框架查询
- django - 如何在api视图函数中使用knox生成的token
- javascript - FileSystemHandle.requestPermission DOMException:需要用户激活才能请求权限
- r - R:完成一个添加了新列的数据集
- postgresql - Postgres 按年龄组确定前 10 个域(排名 + 分组依据)
- html - 折叠时如何使侧边栏元素固定或静态
- c# - 如何在 Swagger 中选择性地将 OperationFilter 添加到 API 端点?
- sql - VBA [Access DB] - 将多个表合并为一个表