包装类自增操作自动拆箱→计算→再装箱;先调用intvalue()拆箱,再对int自增,最后通过valueof()装箱,缓存范围-128~127内可能复用对象,故==比较易出错。

因为包装类的自增操作会自动拆箱→计算→再装箱,整个过程由编译器隐式完成。
拆箱:从 Integer 变成 int
执行 a++ 时,编译器第一步是调用 a.intValue() 把 Integer 对象转为基本类型 int。这一步叫“拆箱”,本质是取对象内部存储的数值。
自增计算:在 int 上执行 ++
拿到 int 值后,按基本类型规则进行自增:比如原值是 1,就变成 2。这个阶段完全不涉及对象,只是纯数值运算。
装箱:把结果再包成 Integer
自增完成后,编译器自动调用 Integer.valueOf(2) 把新值重新包装成 Integer 对象,并赋值回变量 a。注意:这个新对象和原来的不是同一个引用——a 指向了新对象。
缓存机制影响实际对象复用
Integer.valueOf() 在 -128 到 127 范围内会复用缓存对象;超出范围则每次新建对象。所以:
-
Integer a = 100; a++;→ 新值 101 仍在缓存范围内,可能复用已有对象 -
Integer a = 200; a++;→ 新值 201 不在缓存范围,一定生成新对象
这也是为什么 == 比较包装类时容易出错:值相同,但引用可能不同。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











