IntegerCache 是 Java Integer 类中的一个私有静态内部类,用于实现整数对象的缓存机制,旨在提升性能和减少内存占用。以下是对其核心机制的详细剖析:
1. 缓存范围
- 默认范围:
-128到127(包含端点)。 - 可扩展上限:通过 JVM 参数
-XX:AutoBoxCacheMax=<size>指定上限(下限固定为-128)。 - 上限约束:最大值不超过
Integer.MAX_VALUE - 128(避免内存溢出)。
2. 实现原理
类初始化源码(简化版)
private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer cache[];
static {
int h = 127; // 默认上限
// 读取 JVM 参数设置的缓存上限
String prop = System.getProperty("java.lang.Integer.IntegerCache.high");
if (prop != null) {
int val = Integer.parseInt(prop);
h = Math.max(val, 127); // 下限至少为 127
}
high = h;
// 初始化缓存数组
cache = new Integer[(high - low) + 1];
int j = low;
for (int i = 0; i < cache.length; i++) {
cache[i] = new Integer(j++);
}
}
}
关键步骤
- 确定上限:
- 检查系统属性
java.lang.Integer.IntegerCache.high(通过-XX:AutoBoxCacheMax=<size>设置)。 - 若未设置,则使用默认值
127。
- 检查系统属性
- 创建缓存数组:
- 数组大小:
(high - low) + 1(例如默认范围大小为256)。 - 填充数组:预生成从
low到high的所有Integer对象。
- 数组大小:
3. 缓存触发场景
当通过以下方式创建 Integer 对象时,会使用缓存:
自动装箱(Autoboxing)
Integer a = 100; // 实际调用 Integer.valueOf(100)
显式调用 valueOf()
Integer b = Integer.valueOf(50);
valueOf() 方法逻辑
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i); // 超出缓存范围时新建对象
}
4. 缓存验证示例
Integer a = 127;
Integer b = 127;
System.out.println(a == b); // true(同一缓存对象)
Integer c = 128;
Integer d = 128;
System.out.println(c == d); // false(超出缓存,新建对象)
5. 设计意图
- 性能优化:避免频繁创建/销毁小范围整数对象。
- 内存节省:复用常用数字对象(如
-128~127覆盖了常见业务场景)。 - 规范遵循:满足 JLS 对包装类缓存的要求(《Java 语言规范》第 5.1.7 节)。
6. 注意事项
==与equals():- 在缓存范围内,
==可比较值(因对象复用)。 - 最佳实践:始终使用
equals()比较包装类对象。
- 在缓存范围内,
- 扩展上限的风险:
- 过大的缓存范围可能导致内存压力。
- 需权衡性能收益与内存开销。
- 其他包装类的缓存:
Byte/Short/Long:固定范围-128~127。Character:范围0~127。Boolean:缓存TRUE/FALSE。
总结
IntegerCache 是 Java 对常用整数值的一种内存优化手段,通过预创建对象池减少重复实例化。理解其机制可避免包装类比较的常见陷阱,并在必要时通过 JVM 参数调整缓存策略以适应特殊场景。
1154

被折叠的 条评论
为什么被折叠?



