自动装箱/拆箱是编译期语法糖,非jvm运行时机制;装箱插入valueof(),拆箱插入xxxvalue();需警惕null拆箱npe、==比较的缓存陷阱(-128~127)及循环装箱性能损耗。

自动拆装箱本质是编译器生成的代码
它不是 JVM 运行时特殊处理,而是 javac 在编译阶段就替你补全了方法调用:
- 写 Integer a = 10; → 编译后变成 Integer a = Integer.valueOf(10);
- 写 int b = a; → 编译后变成 int b = a.intValue();
- 写 Integer c = a + 5; → 先拆箱 a.intValue(),算完再装箱 Integer.valueOf(...)
必须知道 Integer 缓存范围 [-128, 127]
这是高频考点。valueOf() 并非每次都新建对象:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 在 -128 到 127 之间的整数,Integer.valueOf(i) 返回缓存池里的同一个对象
- 超出该范围(如 200),每次调用都 new 出新对象
- 所以 Integer a = 100; Integer b = 100; a == b 是 true;但 Integer a = 200; Integer b = 200; a == b 是 false
拆箱时最危险的是 null
包装类变量可为 null,但基本类型不能。一旦对 null 拆箱,立刻抛 NullPointerException:
- Integer a = null; int b = a; → 运行时报 NPE(编译不报错)
- 常见于从 Map、数据库查询结果、JSON 反序列化中取值后直接拆箱
- 安全写法:先判空,或用 Objects.requireNonNull(a).intValue(),或改用 Optional
循环中频繁装箱会拖慢性能
尤其在老版本 JDK 或高吞吐场景下:
- for (int i = 0; i → 每次都调用 Integer.valueOf(i),超出缓存范围就 new 对象
- 大量短生命周期对象加重 GC 压力
- 优化建议:提前创建好常用值对象复用;或改用专门的原始类型集合库(如 Eclipse Collections、Trove)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










