【1.JDK底层源码剖析】4.3IntegerCache内部类剖析

IntegerCache 是 Java Integer 类中的一个私有静态内部类,用于实现整数对象的缓存机制,旨在提升性能和减少内存占用。以下是对其核心机制的详细剖析:


1. 缓存范围

  • 默认范围-128127(包含端点)。
  • 可扩展上限:通过 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++);
        }
    }
}
关键步骤
  1. 确定上限
    • 检查系统属性 java.lang.Integer.IntegerCache.high(通过 -XX:AutoBoxCacheMax=<size> 设置)。
    • 若未设置,则使用默认值 127
  2. 创建缓存数组
    • 数组大小:(high - low) + 1(例如默认范围大小为 256)。
    • 填充数组:预生成从 lowhigh 的所有 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. 注意事项

  1. ==equals()
    • 在缓存范围内,== 可比较值(因对象复用)。
    • 最佳实践:始终使用 equals() 比较包装类对象。
  2. 扩展上限的风险
    • 过大的缓存范围可能导致内存压力。
    • 需权衡性能收益与内存开销。
  3. 其他包装类的缓存
    • Byte/Short/Long:固定范围 -128~127
    • Character:范围 0~127
    • Boolean:缓存 TRUE/FALSE

总结

IntegerCache 是 Java 对常用整数值的一种内存优化手段,通过预创建对象池减少重复实例化。理解其机制可避免包装类比较的常见陷阱,并在必要时通过 JVM 参数调整缓存策略以适应特殊场景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农颜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值