自动装箱拆箱是编译期语法糖:javac 将 integer i = 100 编译为 integer.valueof(100),int x = i 编译为 i.intvalue();运行时 integer.valueof 在 [-128, 127] 复用 integercache.cache,超范围则新建对象;缓存因类型而异,boolean 全缓存,double/float 不缓存,且仅 jdk 内置包装类支持。

回答自动装箱与拆箱的源码细节,关键不是背代码,而是讲清楚 编译期行为、运行时逻辑 和 缓存机制 这三层,并能结合 JDK 源码关键位置说明设计意图。
编译期:javac 插入包装/解包调用
Java 编译器(javac)在编译阶段就识别基本类型与包装类之间的赋值或运算,自动插入对应的方法调用:
-
装箱(如
Integer i = 100;)→ 编译为Integer.valueOf(100) -
拆箱(如
int x = i;)→ 编译为i.intValue()
可通过 javap -c 查看字节码验证:原始代码中看似直接赋值,实际字节码里已明确调用 valueOf 和 intValue。
运行时:valueOf 的缓存策略是核心考点
以 Integer.valueOf(int) 为例(其他如 Byte.valueOf、Short.valueOf 类似),JDK 源码中关键逻辑是:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 对 [-128, 127] 范围内的整数,复用内部静态缓存数组
IntegerCache.cache - 超出该范围则每次新建
Integer对象
这就是为什么 Integer a = 127; Integer b = 127; a == b 为 true,而 a = 128; b = 128 时为 false —— 前者指向同一缓存对象,后者是两个独立对象。注意:== 比较的是引用,不是值。
陷阱与边界:null 拆箱和缓存范围差异
面试官常借此考察是否真正理解运行时行为:
-
Integer i = null; int x = i;→ 触发NullPointerException(因为调用i.intValue()时 i 为 null) - 不同包装类缓存范围不同:
Boolean全部缓存(只有 true/false),Character缓存 [0, 127],Long、Integer默认 [-128, 127](可由 JVM 参数-XX:AutoBoxCacheMax扩展) -
Double.valueOf()和Float.valueOf()不缓存,每次都会新建对象
扩展点:自定义包装类无法享受自动装箱
自动装箱是 Java 语言规范强制要求的语法糖,仅适用于 8 种基本类型对应的 JDK 内置包装类(Integer、Boolean 等)。自己写的 MyInt 类即使有 valueOf 和 intValue 方法,也不会被编译器识别和处理 —— 这说明装箱拆箱是编译器与 JVM 协同实现的特例,不是靠约定俗成的命名。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










