A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

第一种情况:
Integer i1 = 127;
Integer i2 = 127;
System.out.println(i1 == i2);     
第二种情况:
Integer i3 = 128;
Integer i4 = 128;
System.out.println(i3 == i4);

i1 == i2 结果是True
i3 == i4 结果是fasle

具体看Integer类的源码,Integer.class加载到内存的时候,会自动创建一个Integer[]数组,包含-128到127的Integer对象,
自动装箱的时候如果被包装的int数范围在-128到127之间,就会找该Integer数组中对应的对象,而不会创建新的对象,所以第一种情况i1,i2都指向同一个对象,地址值一样,结果为true.
第二种情况被包装的int数如果不在[-128,127]的范围内,就会在堆内存中创建新的Integer对象,所以i3和i4指向不同的对象,地址值不一样,结果为false

2 个回复

倒序浏览
Integer类的相关源码:

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

private static class IntegerCache {
        static final int low = -128;
        static final int high;
        static final Integer cache[];

        static {
            // high value may be configured by property
            int h = 127;
            String integerCacheHighPropValue =
                sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
            if (integerCacheHighPropValue != null) {
                int i = parseInt(integerCacheHighPropValue);
                i = Math.max(i, 127);
                // Maximum array size is Integer.MAX_VALUE
                h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
            }
            high = h;

            cache = new Integer[(high - low) + 1];
            int j = low;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);
        }

        private IntegerCache() {}
    }

回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马