Java包装类缓存避坑关键在于规范写法:创建用valueOf()或自动装箱,禁用new;比较值用equals()或Objects.equals(),禁用==;警惕null导致NPE;注意各类型缓存范围不同(如Float/Double不缓存)。

Java 包装类型缓存机制本身不是问题,真正踩坑的是误用 == 比较值、滥用 new 创建对象、忽略 null 和混淆不同包装类的缓存边界。避开这些坑,关键在写法规范和语义清晰。
创建时只走 valueOf(),禁用 new
缓存只对 Integer.valueOf(100) 或自动装箱(如 Integer i = 100;)生效;new Integer(100) 总是新建对象,绕过缓存,浪费内存,且自 Java 9 起已废弃。
- ✅ 推荐:
Integer a = 127;或Integer b = Integer.valueOf(200); - ❌ 避免:
Integer c = new Integer(127);—— 地址必不同,==必然失败
比较值必须用 equals(),别信 ==
== 比的是对象地址,结果取决于是否命中缓存:-128~127 内大概率 true,超出范围基本 false。这种“看运气”的行为极易引发线上逻辑错误。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- ✅ 安全写法:
Objects.equals(a, b)(自动判空 + 调用equals()) - ✅ 若确定非空且追求性能:
a.intValue() == b.intValue() - ❌ 危险写法:
a == b—— 测试用 100 可能通过,上线换 1000 就崩
警惕 null 导致的 NPE
从 Map、JSON、数据库等场景拿到的包装类常为 null,直接拆箱(如 int x = map.get("count");)会立即抛 NullPointerException。
立即学习“Java免费学习笔记(深入)”;
- ✅ 显式兜底:
int value = Optional.ofNullable(i).orElse(0); - ✅ 判空再解包:
if (i != null) { int v = i; } - ❌ 直接赋值:
int x = i;—— 一旦i为null,运行时崩溃
注意各包装类缓存范围不统一
别默认所有包装类都像 Integer 一样缓存 -128~127。实际规则各异:
-
Byte/Short/Long:默认也是 -128~127(Long的上限不可配置) -
Character:只缓存 0~127(ASCII 可见字符) -
Boolean:只有TRUE和FALSE两个实例,始终复用 -
Float/Double:不缓存,每次valueOf()都新建对象

















