integer缓存池默认范围是-128到127,仅对自动装箱和valueof()生效;超出该范围或使用new integer()时==比较返回false,安全比较应统一用equals()或intvalue()。

Java 中 Integer 缓存池(-128 到 127)确实能复用对象、节省内存,但直接用 == 比较可能掉进“相等却 !=”的陷阱——关键在于理解缓存机制的边界和正确用法。
缓存只对自动装箱和 valueOf() 生效
只有通过 Integer.valueOf(int) 或自动装箱(如 Integer i = 100;)创建的值在 [-128, 127] 范围内才会命中缓存;而 new Integer(100) 总是新建对象,无论值多少。
-
安全写法(推荐):始终用
Integer.valueOf(100)或直接赋值Integer i = 100; -
危险写法:
new Integer(100) == new Integer(100)结果为false,即使数值相同
超出缓存范围时,== 不再可靠
一旦数值超出 -128~127(比如 Integer i1 = 200; Integer i2 = 200;),JVM 不保证复用对象,i1 == i2 可能返回 false,尽管 i1.equals(i2) 一定为 true。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 不要依赖
==判断包装类逻辑相等 - 比较数值是否相等,统一用
.equals()或先解包(i1.intValue() == i2.intValue())
自定义缓存范围(不推荐,仅作了解)
可通过 JVM 参数 -Djava.lang.Integer.IntegerCache.high=200 扩大缓存上限(需在启动时设置),但该行为不跨 JVM 实例,且可能增加内存开销,实际项目中极少使用。
- 默认缓存范围是硬编码在
IntegerCache类中的,不可运行时修改 - 扩大缓存对性能提升微乎其微,反而可能误导开发者继续滥用
==
其他包装类也有类似机制
Byte、Short、Long、Character 同样有缓存(Byte/Short/Long 默认也是 -128~127;Character 缓存 0~127),但 Float 和 Double 没有缓存——这点常被忽略。
-
Boolean只有两个实例,Boolean.TRUE和Boolean.FALSE,始终缓存 - 所有包装类的
equals()都会先判空、再比值,比==更安全通用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










