关于new Integer() 和 Integer. valueOf()

推荐使用Integer.valueOf(int)代替new Integer(int),因为这样可以提高性能。当int值介于-128~127时,会直接返回缓存中的对象。

看一下Integer.valueOf() 做了什么

    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);
    }
        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++);
        }

从源码中可以得知,默认对-128到127这256个值做了缓存(如果对JVM参数做了修改,会缓存不同范围的数据,上限最小127,最大2147483518),如果Integer.valueOf()传入参数是在-128到127之间,会直接从IntegerCache的cache数组将值取出来并返回。

所以我们会看到以下现象

关于new Integer() 和 Integer. valueOf()_第1张图片

一般我们是不会直接用 == 来比较两个对象,因为 == 是用来比较两个对象的地址,这里只是说明当java在编译的时候 Integer a = 100; 会被翻译成 Integer a = Integer.valueOf(100); i和j得到的是同一个cache缓存数组中的对象,而m和n已经大于127,最终是通过new Integer()得到的对象,是两个不同的对象。

你可能感兴趣的:(java)