java中integer自动装箱/拆箱是编译器语法糖,依赖integer.valueof()(含-128~127缓存)和intvalue(),非jvm新指令;装箱用valueof复用对象更高效,拆箱遇null抛npe;==比较时缓存内相等、缓存外不等。

Java 中的 Integer 自动装箱(autoboxing)和自动拆箱(unboxing) 是编译器层面的语法糖,底层依赖的是 Integer.valueOf() 和 intValue() 方法,并非 JVM 直接支持的新指令。
装箱:把 int 变成 Integer 对象
当你写 Integer i = 100;,编译器会把它翻译成:
- 调用
Integer.valueOf(100),而不是直接 new Integer(100) -
valueOf()方法内部有一个缓存机制:对 -128 到 127 范围内的整数,复用已创建的Integer实例(存在IntegerCache数组中) - 超出该范围(比如
Integer i = 2000;),每次都会新建对象
拆箱:把 Integer 变回基本类型 int
当你写 int j = i;(其中 i 是 Integer 类型),编译器会替换成:
- 调用
i.intValue()方法获取内部的value字段值 - 如果 i 是 null,运行时会抛出
NullPointerException(这是常见陷阱)
为什么不用 new Integer()?
因为 new Integer(int) 构造器在 Java 9 中已被标记为 deprecated,且它不走缓存,每次都创建新对象,浪费内存。而 Integer.valueOf() 在小整数范围内能复用对象,更高效。
需要注意的坑
- 两个通过装箱得到的 Integer,用 == 比较时结果可能出人意料:
Integer a = 127, b = 127;→a == b为 true;但Integer c = 128, d = 128;→c == d为 false(因为缓存只到 127) - 拆箱时若对象为 null,会立即触发 NPE,例如
Integer x = null; int y = x; - 循环中频繁装箱(如
for (Integer i = 0; i )可能引发大量临时对象,影响性能
不复杂但容易忽略细节。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











