上述代码x与y作比较结果是true,而i与j比较则是false。 问题来了,同样是数值一样,为什么他两的结果不一样呢? 关于上面的结果分析:查阅Integer的源码,发现在其中有个成员内部类。
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) { try { 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); } catch( NumberFormatException nfe) { // If the property cannot be parsed into an int, ignore it. } } high = h; cache = new Integer[(high - low) + 1]; int j = low; for(int k = 0; k < cache.length; k++) cache[k] = new Integer(j++); // range [-128, 127] must be interned (JLS7 5.1.7) assert IntegerCache.high >= 127; } private IntegerCache() {} }在Integer中定义的成员内部类IntegerCache,将 -128 到 127 之间的每个数字先提前封装成Integer对象,并且缓存起来。
Integer x = 127; Integer y = 127; Integer i = 128; Integer j = 128;将int类型的数据赋值给Integer引用的时候,会发生自动装箱,这时不是将每个int值都包装成Integer对象,而是先判断当前需要包装的int值在不在IntegerCache缓存的数组中,如果有直接将缓存数组中的对象的地址赋值给程序中的x和y引用。但是128并不再缓存中,所以每次装箱都会重新封装128为一个新的对象。