包装类的缓存问题

        整型、char类型所对应的包装类,在自动装箱时,对于-128~127之间的值会进行缓存处理,其目的时提高效率。

        缓存原理为:如果数据在-128~127这个区间,那么在类加载时就已经为该区间的每个数值创建了对象、并将这256个对象存放到一个名为cache的数组中。每当自动装箱过程发生时(或者手动调用valueOf()时),就会先判断数据是否在该区间,如果在则直接获取数组中对应的包装类对象的引用,如果不在该区间,则会通过new调用包装类的构造方法来创建对象。

以Integer为例,查看Java提供的源码,加深对缓存技术的理解:

public static Integer valueOf(int i){
    if(i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

这段代码中我们需要解释下面几个问题:

        1.IntegerCache类为Integer类的一个静态内部类,仅供Integer类使用。

        2.一般情况下IntegerCache.low为-128,IntegerCache.high为127。

IntegerCache.cache为内部类的一个静态属性,如下示例:

IntegerCache类相关源码:

private static class IntegerCache{
    static final int low = -128;
    static final int high;
    static final Integer cache[];
    static {
        int h = 127;
        String integerCacheHighPropValue = 
            sun.misc.VM.getSavedProperty("java.lang.IntegerCache.high");
        if(integerCacheHighPropValue != null){
            try{
                int i = parseInt(integerCacheHighPropValue);
                i = Math.max(i,127);
                h = math.min(i,Integer.MAX_VALUE - (-low) -1);
            }catch(NumberFormatException nfe){
                
            }
        }
        high = h;
        cache = new Integer[(high - low) + 1];
        int j = low;
        for(int k = 0;k < cache.length;k++)
            cache[k] = new Integer(j++);
        assert IntegerCache.high >= 127;
    }
    private IntegerCache(){}
}

由上面的源码可以看到,静态代码块的目的就是初始化数组cache的,这个过程会在类加载时完成。

包装类的缓存测试:

public class Test3{
    public static void main(String[] args){
        Integer in1 = -128;
        Integer in2 = -128;
        System.out.println(in1 == in2);  //true 因为-128在缓存范围内
        System.out.println(in1.equals(in2));  //true
        Integer in3 = 1234;
        Integer in4 = 1234;
        System.out.println(in3 == in4);  //false 因为1234不在缓存范围内
        System.out.println(in3.equals(in4));  //true
    }
}

自动装箱调用的时valueOf()方法,而不是new Integer()方法。

自动拆箱调用的xxxValue()方法。

包装类在自动装箱时为了提高效率,对于-128~127之间的值会进行缓存处理。超过范围后,对象之间不能再使用==进行数值的比较,而是使用equals方法。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值