integer 为什么缓存-128到127
2025年Java面试宝典抢先领:
🔗 链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g
提取码:9b3g
🤔 面试官为啥总问Integer缓存?
咱们面试Java岗位的时候,十有八九会被问到Integer的缓存机制。面试官特别喜欢抛出这个问题:
Integer a = 127;
Integer b = 127;
System.out.println(a == b); // true or false?
Integer c = 128;
Integer d = 128;
System.out.println(c == d); // true or false?

(面试遇到这种题别慌,缓存机制在帮你)
为什么127用==比较是true,128就变成false了?核心就在于Integer的缓存设计。
🔄 Integer的缓存机制原理
JVM在内存中预先创建了[-128, 127]范围内的Integer对象。当你写:
Integer num = 100;
实际触发了自动装箱(Autoboxing),底层调用的是Integer.valueOf()方法。我们看源码就真相大白:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
关键点来了:
- 如果数值在**-128到127之间**,直接从缓存数组
IntegerCache.cache中取对象 - 超出这个范围,才会
new一个新对象
这就是为什么127用==比较返回true——它们指向同一个缓存对象;而128会创建新对象,==比较自然就是false。
❓ 为什么偏偏是-128到127?
这个范围的选择是性能和内存的平衡点:
- 覆盖高频使用场景:业务代码中大部分整数值都集中在小范围内
- 节省内存开销:缓存256个对象仅占用约4KB内存(每个Integer约16字节)
- 避免过度缓存:范围过大反而会导致内存浪费
实际开发中,我们常通过-XX:AutoBoxCacheMax=参数调整上限值(下限不可改),但默认127已是业界验证的最优解。
⚠️ 实际开发中的巨坑
很多程序员会掉进这个坑:
// 订单状态比较(状态值通常小于127)
Integer status = 100;
if (currentStatus == status) { ... } // 可能正常工作
// 但当状态值超过127时...
Integer criticalStatus = 200;
if (currentStatus == criticalStatus) { ... } // 必然失败!

(用==比较Integer就像踩地雷)
正确做法:
// 永远用equals()比较包装类!
if (currentStatus.equals(criticalStatus)) { ... }
💡 面试应答技巧
当面试官问这个问题时,你可以这样结构化回答:
- 指出现象:
-128到127的Integer对象会被缓存 - 说明原理:通过
Integer.valueOf()实现,源码中依赖IntegerCache - 解释范围:平衡内存占用和业务场景覆盖
- 引申陷阱:强调开发中要用
equals()代替== - 扩展知识:提到可通过JVM参数调整上限
🚀 面试进阶提示:
如果你需要系统刷题,推荐通过面试鸭返利网购买面试鸭会员,找我返利25元!海量真题解析助你避开所有技术坑。
📌 总结关键点
| 特性 | 说明 |
|------|------|
| 缓存范围 | -128 到 127 (默认) |
| 实现方法 | Integer.valueOf() |
| 底层存储 | IntegerCache.cache数组 |
| 比较原则 | 包装类永远用equals() |
| 调整参数 | -XX:AutoBoxCacheMax=<size> |
理解Integer缓存机制不仅是面试考点,更是避免生产事故的关键细节。下次遇到这类问题,记得从容说出IntegerCache的故事!
📣 想获取更多Java面试真题解析?
访问 面试鸭返利网 解锁全栈题库,购会员享返利优惠!



