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

如何解释这段Int类型的Kotlin代码?代码中"同一个对象"指什么?

Why does var a: Int = 10000; var b: Int = 10000; print(b === a) print true in Kotlin?

嘿,这个问题得结合Kotlin在JVM平台上对基本类型的处理逻辑来拆解,咱们一步步说清楚:

首先先把你的代码放在代码块里方便查看:

var a: Int = 10000
var b: Int = 10000
print(b === a) // Prints 'true'

1. Kotlin中Int的两种存在形态

在JVM平台上,Kotlin的Int分两种情况:

  • 原始类型(primitive int):当你直接声明非空的Int变量(比如代码里的a和b),编译器会把它编译成Java的原始类型int——这玩意儿不是对象,就是内存里存的一个纯数值,没有“引用地址”这种概念。
  • 装箱类型(boxed Integer):当你需要把Int当作对象使用时(比如赋值给Any类型、放进泛型集合,或者声明成Int?可空类型),Kotlin会自动把它装箱成Java的Integer对象,这时候它就有了内存中的实例地址。

2. ===运算符的行为差异

Kotlin里的===是引用相等性检查,但它的行为会根据比较的类型变化:

  • 当比较的是原始类型(比如你的代码里的a和b),===和==的效果完全一致——都是直接比较数值是否相等,因为原始类型不存在“指向对象”的说法,本质就是比数值。这就是为什么你的代码输出true,其实就是在判断10000和10000的数值是否相同。
  • 当比较的是装箱后的对象类型(比如Int?或者Integer),===才会严格遵循官方文档的规则:a === b为true,当且仅当a和b指向内存中的同一个对象实例。

3. 什么是“同一个对象”?

官方文档里说的“point to the same object”,意思是两个变量引用的是内存中完全相同的那个实例——简单说就是它们指向同一块内存地址,是同一个东西,而不是两个内容相同但独立的对象。举个直观的例子:

// 这里把Int装箱成了Integer对象
val x: Int? = 10000
val y: Int? = 10000
println(x === y) // 输出false,因为是两个独立的Integer实例

// 但如果是在JVM整数池范围内(默认-128到127)
val m: Int? = 100
val n: Int? = 100
println(m === n) // 输出true,因为JVM会缓存这个区间的Integer对象,复用同一个实例

总结一下你的代码:因为a和b是原始类型的Int(非装箱状态),所以===在这里做的是数值比较,自然输出true;只有当你处理的是装箱后的Int对象时,才需要考虑“是否指向同一个对象”的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:40:42