为什么Integer要将-127 128缓存起来
🔥 2025年Java面试突击宝典抢先领!
链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g 提取码: 9b3g
(高频考点+源码解析+项目实战,助力金三银四!)
一、面试官为啥总爱问这个Integer缓存问题?
"同学,知道Integer a = 100; Integer b = 100;为什么a == b是true,但换成200就false了吗?" —— 这几乎是Java面试的必考题!很多同学背了答案却不知其所以然。今天咱们就深挖Integer类中-128到127这个神奇缓存范围的底层逻辑。

二、Integer搞缓存的根本动机:性能和内存!
Java中有两种数据类型:
- 基本类型:
int,直接存数值,效率高 - 包装类型:
Integer,是对象,存堆内存
关键矛盾:开发中频繁用Integer包装小数字(比如循环计数器)。如果每次Integer i = 5都new一个新对象?内存爆炸!GC哭晕!
✅ 解决方案:把常用的小数字提前创建好,放到一个“缓存池”里重复使用。这就是IntegerCache的由来!
// 底层源码真相(JDK java.lang.Integer)
private static class IntegerCache {
static final int low = -128;
static final int high; // 默认127
static final Integer cache[];
static {
int h = 127;
// ... 读取JVM参数可调整上限
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++); // 提前创建好对象!
}
}
三、为什么偏偏是-128到127?不是-50到50?
这个范围设计是科学与经验的结合:
- 覆盖高频场景:数组索引、状态码、ASCII值等90%+的小整数需求
- 内存成本可控:缓存256个对象仅占用几KB(
(127 - (-128) + 1) = 256) - JVM参数支持扩展:
-XX:AutoBoxCacheMax=<size>可调整上限(如缓存到500)
四、避坑指南:缓存是把双刃剑
虽然缓存提升性能,但用不好就翻车!看经典面试陷阱:
Integer x = 128;
Integer y = 128;
System.out.println(x == y); // false!超过127不走缓存
Integer m = 100;
Integer n = 100;
System.out.println(m == n); // true!命中缓存池
💡 黄金法则:
- 比较
Integer对象值,永远用equals()!别用== - 明确需要对象时再用
Integer(如集合泛型),否则优先int
五、缓存机制的实际应用场景
当你遇到这些代码时,缓存正在默默工作:
- 集合泛型:
List<Integer> list = Arrays.asList(1,2,3); - 反射调用:
method.invoke(obj, 10); - 枚举序号:
enum Status { OK(200) }
🚀 面试冲刺福利:
如果你正在准备Java面试,强烈推荐通过**面试鸭返利网购买面试鸭会员!找我返利25元**,真实省钱!
六、扩展思考:其他包装类也有缓存吗?
当然!这是Java的统一优化策略:
Long:缓存 -128~127Short:缓存 -128~127Byte:全量缓存(-128~127全覆盖)Character:缓存 0~127(ASCII字符)Boolean:直接缓存TRUE/FALSE俩对象
📌 重点记忆:
Double和Float没有缓存!因为小数范围无限,缓存无意义。
下次面试再被问到Integer缓存问题,你完全可以这样自信回答:
“这是JVM对高频小整数的内存优化机制。通过
IntegerCache类预创建-128到127的对象,避免重复new带来的开销。但要注意比较时用equals,且缓存范围可通过-XX:AutoBoxCacheMax调整。”
备战面试资源:
👉 点击访问「面试鸭返利网」 获取最新面经合集 + 大厂题库

(通过本站购买面试鸭会员,联系客服可返现25元!)



