integer通过integercache缓存-128~127范围对象以复用、省内存;默认上限127可调,仅valueof()和自动装箱命中缓存,new integer()绕过缓存。

Java 中的 Integer 通过内部静态类 IntegerCache 实现常用数值缓存,核心是**复用对象、避免重复创建**,从而节省内存并提升性能。这个机制只在特定条件下生效,不是所有整数都会被缓存。
缓存范围与初始化时机
缓存默认覆盖 -128 到 127(含两端),这是 Java 规范强制要求的最小范围:
- 下限固定为 -128,不可修改;
- 上限默认为 127,但可通过 JVM 参数
-XX:AutoBoxCacheMax=200扩展(例如设为 200,则缓存 -128 ~ 200); - 缓存数组
cache[]在类加载时由静态代码块一次性初始化,每个元素对应一个预先创建的Integer对象; - 比如
cache[0]存的是new Integer(-128),cache[255]存的是new Integer(127)(因为索引 = 值 - (-128))。
什么操作会命中缓存
只有调用 Integer.valueOf(int) 或触发自动装箱时才走缓存逻辑,new Integer(int) 完全绕过:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
Integer a = 127;→ 编译后等价于Integer a = Integer.valueOf(127);→ 返回缓存中同一个对象; -
Integer b = Integer.valueOf(127);→ 直接查IntegerCache.cache[127 + 128]→ 命中; -
Integer c = new Integer(127);→ 总是新建对象,不查缓存,c == a为false; - 超出范围如
Integer d = 128;→valueOf(128)返回新对象,每次都不一样。
valueOf 方法如何定位缓存对象
Integer.valueOf(int i) 的核心判断非常直接:
- 检查
i是否满足i >= IntegerCache.low && i ; - 若满足,计算数组索引:
i + (-IntegerCache.low)(即i + 128),再取cache[索引]; - 若不满足,直接
return new Integer(i); - 注意:缓存数组长度恒为
(high - low) + 1,所以索引不会越界。
为什么设计成静态内部类
IntegerCache 是 private static final 的,这样设计有明确目的:
- 静态保证类加载时就完成初始化,无需实例依赖;
- 私有防止外部访问或篡改,保障缓存一致性;
- final 数组和字段确保初始化后不可变,线程安全;
- 不对外暴露缓存细节,符合封装原则——用户只需知道“-128~127 被缓存”,不必关心实现。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










