Java装箱拆箱是编译器自动插入的隐式转换,装箱调用valueOf()(含缓存机制),拆箱调用xxxValue();null拆箱抛NPE,==比较需谨慎,循环中频繁装拆箱影响性能。

装箱:基本类型 → 包装类对象
把 int 变成 Integer、double 变成 Double 这类操作叫装箱。
- 编译器实际调用的是包装类的 valueOf() 方法,例如
Integer i = 100;等价于Integer i = Integer.valueOf(100); - 常见触发场景:赋值给包装类变量、添加到集合(如
list.add(5))、作为方法参数传入需要包装类的形参 - 注意缓存机制:
Integer.valueOf(127)返回缓存对象,Integer.valueOf(128)新建对象;Byte、Short、Long、Character也有类似 -128~127 缓存范围,Boolean只有 true/false 两个实例,Float和Double不缓存
拆箱:包装类对象 → 基本类型
把 Integer 变回 int、Boolean 变回 boolean 就是拆箱。
- 编译器实际调用的是包装类的 xxxValue() 方法,例如
int x = i;等价于int x = i.intValue(); - 常见触发场景:赋值给基本类型变量、参与算术运算(如
i + 1)、条件表达式中使用、返回值为基本类型的方法接收包装类结果 - 最大风险:对 null 包装类变量执行拆箱会直接抛
NullPointerException,例如Integer i = null; int x = i;
哪些地方悄悄发生装拆箱
日常写法看着简单,背后都在转换:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
ArrayList<integer> list = new ArrayList(); list.add(3);</integer>—— 3 装箱;int a = list.get(0);—— get() 返回 Integer,再拆箱 -
Integer a = 1; int b = a + 2;—— a 先拆箱才能加 -
Integer result = flag ? 10 : null;—— 10 装箱,整个表达式类型是Integer - 方法重载中:若同时有
void m(int)和void m(Integer),传5优先匹配基本类型版本;传new Integer(5)则走包装类版本
容易踩坑的关键点
省事但有陷阱,得留心:
立即学习“Java免费学习笔记(深入)”;
-
== 比较不等于相等:两个
Integer用==比较的是引用。127 以内可能为true(缓存复用),128 开始大概率false;建议数值比较统一用.equals()或先拆箱 -
null 拆箱必崩:任何包装类变量在不确定是否为 null 时,别直接赋给基本类型,可先判空或用
Objects.requireNonNull() -
循环里频繁装拆箱伤性能:比如
for (Integer i : list) sum += i;,每次迭代都拆箱,i++ 还会反复装箱生成新对象,加重 GC 压力;高频场景建议用原始类型集合(如IntList)或显式处理

















