java包装类缓存是jvm自动实现的机制,通过valueof()或自动装箱复用-128~127(integer/byte/short/long)、0~127(character)、true/false(boolean)范围内的对象,避免new创建重复实例;float/double不缓存;比较应优先用equals()而非==。

用 valueOf() 代替 new 构造器
所有支持缓存的包装类(Byte、Short、Integer、Long、Character、Boolean)都提供了 valueOf() 静态工厂方法,它会检查值是否在缓存范围内,命中就复用对象。
- ✅ 正确:
Integer a = Integer.valueOf(100);→ 返回缓存对象(-128 ~ 127 内) - ❌ 错误:
Integer b = new Integer(100);→ 总是新建对象,且 Java 9+ 已废弃 - ⚠️ 注意:自动装箱(如
Integer c = 100;)底层调用的也是valueOf(),所以安全;但Integer d = 200;超出范围,仍会新建对象
关注各类型默认缓存范围
缓存不是全量生效,只对常用小值有效。超出范围的对象不会被复用,即使数值相同也会创建多个实例:
- Integer / Byte / Short / Long:默认 -128 到 127(闭区间)
- Character:0 到 127(即 ASCII 可见字符和控制字符)
-
Boolean:仅
TRUE和FALSE两个常量,永远复用 - Float / Double:不缓存——浮点数精度和离散性导致缓存无意义
必要时扩展 Integer 缓存上限
如果业务中高频使用比如 0~500 的整数(如状态码、ID 偏移量),可以扩大 Integer 缓存范围:
- 启动 JVM 时加参数:
-XX:AutoBoxCacheMax=500 - 这样
Integer.valueOf(300)也会返回缓存对象,==比较可能为 true - ⚠️ 注意:该参数只对
Integer有效;Byte、Short、Long缓存范围固定不可调
比较时别依赖 ==,优先用 equals()
缓存机制会影响 == 的结果,但这是副作用,不是设计目的。实际开发中应避免用 == 比较包装类:
- ❌ 危险:
if (a == b)—— 在 -128~127 内可能为 true,超出就 false,逻辑不稳定 - ✅ 安全:
if (Objects.equals(a, b))或a.equals(b)(注意 a 不能为 null) - ? 小技巧:集合(如
HashMap)的 key 使用 Integer 时,内部用的是equals()和hashCode(),所以缓存与否不影响功能,但影响内存占用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











