You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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。

你可以通过两种方式解决这个问题:

  1. 显式调用缓存方法强制命中缓存,即使Debug模式下也能生效:
val boxedA: Int? = Integer.valueOf(100)
val anotherBoxedA: Int? = Integer.valueOf(100)
  1. 将测试的编译运行模式改为Release,和main函数保持一致。

另外补充一点:如果你的需求只是判断数值相等,使用==(值比较)会比依赖JVM缓存的===(引用比较)更稳妥,无需受运行模式影响。

内容的提问来源于stack exchange,提问作者EARTH H

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 03:14:52