调用 list.add(10) 时,编译器自动插入 Integer.valueOf(10) 实现装箱,因 10 在 [-128, 127] 缓存范围内,直接复用已有 Integer 实例,不新建对象。

当你写 list.add(10) 时,整数 10 会自动装箱为 Integer 对象。
装箱发生在参数传递阶段
因为 ArrayList.add(E e) 是泛型方法,而声明是 List list = new ArrayList();(未指定类型),此时泛型擦除后实际方法签名等价于 add(Object e)。编译器发现你传入的是基本类型 int,但形参需要引用类型,于是自动插入装箱操作:
-
10(int值)→ 调用Integer.valueOf(10)→ 返回一个Integer实例 - 这个
Integer对象被压入堆内存(或从缓存复用,见下条)
valueOf 方法可能复用缓存对象
Integer.valueOf(int) 并不总是新建对象。它内部维护了 [-128, 127] 范围的缓存数组:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
-
10在缓存范围内 → 直接返回已存在的Integer缓存实例(不是新new Integer(10)) - 若换成
list.add(200),则会真正创建新对象(除非 JVM 参数调整了缓存范围)
整个调用链很短但关键
源码层面可简化为:
立即学习“Java免费学习笔记(深入)”;
- 你写:
list.add(10); - 编译器改写:
list.add(Integer.valueOf(10)); - JVM 执行:
Integer.valueOf(10)查缓存 → 返回共享的Integer实例 → 存入ArrayList内部数组
所以不是“先创建再装箱”,而是“编译期插入装箱调用”,且多数小整数不会产生新对象。

















