好的,我们来探讨Java中的“Integer128陷阱”。这是Java自动装箱机制和Integer对象缓存范围导致的一个常见问题。
现象描述
在Java中,对于Integer对象,当使用==运算符比较两个值为-128到127之间的Integer对象时,结果可能为true;但当比较两个值相同但超出此范围的Integer对象(例如都为128)时,结果却可能为false。例如:
Integer a = 127;
Integer b = 127;
System.out.println(a == b); // 输出 true
Integer c = 128;
Integer d = 128;
System.out.println(c == d); // 输出 false
原因分析
自动装箱与缓存池:
- Java对Integer类型在-128到127之间(默认范围)的值维护了一个静态缓存池。
- 当通过自动装箱(如Integer a = 127;)创建对象时,JVM会优先从缓存池中返回已存在的对象引用。
- 因此,a和b指向同一个缓存对象,==比较引用地址相同。
超出缓存范围:
- 对于值128(超出缓存范围),自动装箱会每次new一个新的Integer对象。
- 因此c和d是两个不同的对象,==比较的是引用地址,结果为false。
源码验证
查看Integer.valueOf(int)方法:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
解决方案
使用equals()而非==比较对象内容:
System.out.println(c.equals(d)); // 输出 true
http://my.tv.sohu.com/us/442093011/698464610.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDYxMC5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698464468.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDQ2OC5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698464561.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDU2MS5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698464731.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDczMS5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698464568.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDU2OC5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698464579.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDU3OS5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698464588.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDU4OC5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698464652.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDY1Mi5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698464812.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDgxMi5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698464770.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDc3MC5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698464907.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDkwNy5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698464912.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDkxMi5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698464917.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDkxNy5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698464669.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDY2OS5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698464830.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDgzMC5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698464837.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDgzNy5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698464788.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDc4OC5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698464688.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDY4OC5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698464800.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDgwMC5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698464862.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDg2Mi5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698464869.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDg2OS5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698464879.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDg3OS5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698464883.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDg4My5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698465020.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NTAyMC5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698465128.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NTEyOC5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698465135.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NTEzNS5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698465035.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NTAzNS5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698464980.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDk4MC5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698465154.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NTE1NC5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698465054.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NTA1NC5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698465169.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NTE2OS5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698465186.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NTE4Ni5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698465190.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NTE5MC5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698465090.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NTA5MC5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698465326.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NTMyNi5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698465271.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NTI3MS5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698465412.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NTQxMi5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698465337.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NTMzNy5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698465339.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NTMzOS5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698465424.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NTQyNC5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698465434.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NTQzNC5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698465440.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NTQ0MC5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698465518.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NTUxOC5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698465639.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NTYzOS5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698465649.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NTY0OS5zaHRtbA==.html
http://my.tv.sohu.com/us/442093011/698465558.shtml
https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NTU1OC5zaHRtbA==.html
equals()方法比较的是包装类内存储的int值是否相等,而非对象地址。
总结
- 陷阱本质:混淆了==(引用比较)与equals()(值比较)的语义。
- 最佳实践:对包装类(Integer、Long等)的比较,始终使用equals()方法。
- 扩展知识:缓存范围可通过JVM参数-XX:AutoBoxCacheMax=<size>调整上限(下限固定为-128)。
理解此机制有助于避免在代码中引入隐蔽的Bug。
网硕互联帮助中心





评论前必须登录!
注册