Java中Integer默认缓存-128~127,故a==b为true;128超出范围,c和d为不同对象,c==d为false;应使用equals()或intValue()比较值,避免new Integer()。

在 Java 中,Integer a = 127; 和 Integer b = 127; 比较时,a == b 为 true;而 Integer c = 128; 和 Integer d = 128; 比较时,c == d 为 false。
这是由于 Integer 缓存机制导致的
Java 对 -128 到 127(含)之间的整数做了缓存优化。当通过自动装箱(如 Integer a = 127)创建该范围内的 Integer 对象时,JVM 会复用缓存中的同一个对象,因此 a 和 b 实际指向堆中同一实例。
- 缓存范围可通过 JVM 参数
-XX:AutoBoxCacheMax=N扩大(如设为 200),但默认就是 -128 ~ 127 - 这个缓存由
Integer.valueOf(int)方法实现,而==比较的是引用地址,不是值
128 超出默认缓存范围,每次都会新建对象
Integer c = 128 实际调用的是 Integer.valueOf(128),但因 128 不在缓存区间内,方法会 new 一个新对象;同理 d 也是另一个新对象,两者内存地址不同,所以 c == d 返回 false。
- 即使值相同,两个 new 出来的 Integer 对象引用也不同
- 若想安全比较数值,应统一使用
.equals()或先拆箱再用==(如c.intValue() == d.intValue())
注意:new Integer(x) 总是新建对象,不受缓存影响
如果写成 Integer e = new Integer(127); Integer f = new Integer(127);,那么 e == f 一定是 false,因为 new 强制创建新实例,与缓存无关。
-
new Integer(127).equals(new Integer(127))是 true(值相等) - 现代代码应避免使用
new Integer(x),推荐用Integer.valueOf(x)或直接赋值
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











