Kotest中-128~127装箱数字恒等判断为何与main函数结果不同?
Kotest测试与main函数中可空Int引用比较结果不一致的原因
根据Kotlin官方文档说明,JVM会对-128到127之间的Integer做内存缓存,因此该范围内的可空Int理论上应指向同一对象,但你遇到的差异核心原因是编译/运行时的优化级别不同:
- main函数默认以Release模式编译运行,Kotlin编译器会自动把
val boxedA: Int? = 100这类代码编译为调用Integer.valueOf(100),这个方法会命中JVM的Integer缓存池,所以两个变量引用同一个对象,===引用比较返回true。 - Kotest测试代码默认以Debug模式运行,此时编译器为了方便调试,会跳过自动装箱的缓存优化,直接创建新的
Integer实例(等价于new Integer(100)),导致两个变量的引用地址不同,===比较返回false。
你可以通过两种方式解决这个问题:
- 显式调用缓存方法强制命中缓存,即使Debug模式下也能生效:
val boxedA: Int? = Integer.valueOf(100) val anotherBoxedA: Int? = Integer.valueOf(100)
- 将测试的编译运行模式改为Release,和main函数保持一致。
另外补充一点:如果你的需求只是判断数值相等,使用==(值比较)会比依赖JVM缓存的===(引用比较)更稳妥,无需受运行模式影响。
内容的提问来源于stack exchange,提问作者EARTH H
相关产品推荐
相关产品推荐

