Java装箱调用valueOf()、拆箱调用xxxValue(),是编译期自动插入的操作;Byte/Short/Integer/Long/Character在-128~127(Character为0~127)缓存对象,Boolean仅TRUE/FALSE,Float/Double不缓存;==比较易出错,应优先用equals(),null拆箱抛NPE。

Java 中基本数据类型和包装类之间的装箱与拆箱,是编译器在编译期自动插入的转换操作,并非运行时动态行为。核心在于:装箱调用 valueOf(),拆箱调用 xxxValue()(如 intValue()),全程不涉及 new 或反射。
装箱:基本类型 → 包装类对象
当把一个基本类型值赋给对应包装类引用时(如 Integer i = 100;),编译器会将其转为 Integer.valueOf(100) 调用,而不是 new Integer(100)。
-
缓存优化存在:
Byte、Short、Integer、Long、Character对 -128 到 127 范围内的值复用缓存对象;Boolean只有TRUE和FALSE两个实例 -
超出缓存范围会新建对象:例如
Integer.valueOf(200)每次都生成新实例,内存开销需留意 -
不触发装箱的场景:泛型类型擦除后、反射调用、
instanceof判断等,都不走自动装箱逻辑
拆箱:包装类对象 → 基本类型
当包装类对象出现在需要基本类型的上下文中(如算术运算、方法参数、赋值给基本类型变量),编译器插入对应 xxxValue() 方法调用。例如 int x = i;(i 是 Integer)会被转为 i.intValue()。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
null 拆箱立即抛 NPE:若对象为
null,调用intValue()等方法时运行时报NullPointerException - 所有 xxxValue() 方法都是 final 且无副作用:不能被重写,也不改变原对象状态
-
仅在明确支持的上下文中发生:比如三元表达式
flag ? 1 : null中,1会装箱,但整个表达式类型由统一目标类型决定
常见陷阱与规避方式
看似方便,但几个细节极易引发线上问题:
立即学习“Java免费学习笔记(深入)”;
-
避免用 == 比较包装类对象:-128~127 内可能因缓存返回 true,超出范围几乎总是 false;应统一用
equals() -
集合操作隐含高频装拆箱:如
for (Integer i : list) sum += i;,循环中每次i都要拆箱;可改用原始类型集合库或提前解包 -
方法重载易误匹配:同时存在
f(int)和f(Object)时,传入Integer可能意外走入Object版本 -
判空必须前置:使用前先检查
if (i != null),再执行拆箱操作或调用intValue()
各基本类型与包装类对照及缓存范围
Java 八种基本类型均有对应包装类,命名规律为首字母大写(int→Integer、char→Character 等):
-
整型类:
Byte、Short、Integer、Long— 缓存默认 -128 ~ 127(部分可通过 JVM 参数调整) -
字符类:
Character— 缓存 0 ~ 127 -
布尔类:
Boolean— 仅TRUE/FALSE两个常量实例 -
浮点类:
Float、Double— 不做缓存,每次valueOf()都新建对象

















