自动装箱是编译器将基本类型转为包装类(如int→Integer)的语法糖,通过valueOf()实现并含缓存优化;自动拆箱则相反,通过xxxValue()方法实现,可能抛出NullPointerException。

Java中自动装箱是指把基本类型(如 int)自动转成对应包装类(如 Integer)的过程;自动拆箱则是反过来,把包装类对象自动转回基本类型。这俩都不是JVM新增的指令,而是编译器在编译阶段悄悄加进去的语法糖。
装箱靠的是 valueOf() 方法
当你写 Integer i = 100;,编译器实际替换成:
Integer i = Integer.valueOf(100);
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
valueOf() 内部有缓存优化:对 -128 到 127 范围内的整数,直接复用
IntegerCache中已有的对象 - 超出这个范围(比如
Integer i = 2000;),每次都会新建对象 - 不推荐用
new Integer(100),它既不走缓存,又在 Java 9+ 被标记为过时
拆箱靠的是 xxxValue() 方法
当你写 int j = i;(其中 i 是 Integer 类型),编译器实际替换成:
int j = i.intValue();
- 所有包装类都提供对应方法:比如
Long.longValue()、Boolean.booleanValue() - 如果
i是null,调用intValue()会立刻抛NullPointerException - 这不是“取字段”那么简单,而是实实在在的方法调用,有运行时开销和风险
底层本质是编译期转换,不是运行时特性
字节码里根本看不到“自动”二字——你写的每行装箱/拆箱代码,都被编译器提前翻译成了明确的方法调用。所以:
- 调试时断点会跳进
valueOf()或intValue()源码里 - 性能问题、NPE、==比较异常,根源都在这些被插入的方法行为上
- 理解它们,就等于看穿了自动装箱拆箱的全部逻辑

















