Integer i1 = 10;
Integer i2 = 10;
System.out.println(i1 == i2);
Integer a1 = 128;
Integer a2 = 128;
System.out.println(a1 == a2);
打印结果是true和false,至于为什么看了Integer源代码后就能明白,Integer有个内部类IntegerCache,它维护了一个Integer数组cache[] ,长度为256,还有一个静态块
static {
for(int i = 0; i < cache.length; i++)
cache = new Integer(i - 128);
}
很明显这个静态块已经默认认创建出了-128~127 的 Integer 数据,这也是JAVA出于性能考虑。
至于上面的代码经过编译后就变成了
Integer i1 = Integer.valueOf(10);
Integer i2 = Integer.valueOf(10)
System.out.println(i1 == i2);
Integer a1 = Integer.valueOf(128)
Integer a2 = Integer.valueOf(128)
System.out.println(a1 == a2);
看看Integer的valueOf方法,若是在-128到127之间的数,它会直接数据引用,因为它已经创建了数据对象,但若超出这个范围,它就new了一个Integer对象。所以值为128时,每次都是不同的对象。
public static Integer valueOf(int i) {
final int offset = 128;
if (i >= -128 && i <= 127) { // must cache
return IntegerCache.cache[i + offset];
}
return new Integer(i);
}
顺带一提,我用的JDK 1.5,若在1.4环境下Integer i1 = 10; 这种写法会报错,
必须改为Integer i1 = new Integer(10); 这是因为1.5的自动装箱特性。