先来看demo
@Test
public void test() {
Integer a1 = 1000;
Integer b1 = 1000;
Integer a2 = 100;
Integer b2 = 100;
Integer a3 = new Integer(100);
Integer b3 = new Integer(100);
System.out.println("第一组:"+ (a1 == b1));
System.out.println("第二组:"+ (a2 == b2));
System.out.println("第三组:"+ (a3 == b3));
}
结果:
第一组:false
第二组:true
第三组:false
Process finished with exit code 0
分析
==实际上比的是对象的地址
javap -c .\TestDemo.class 之后可以看到 装箱实际调用Integer的valueOf方法
a1==b1
比较时进行会自动转换 调用Integer的valueOf方法
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
会先判断值在不在IntegerCache中 如果在直接返回 IntegerCache的范围[-128,127]
故不在 需要new Integer对象 地址肯定不相等 打印false
a2=b2
在IntegerCache中 故对象地址相等 打印true
a3=b3
都是重新new的Integer对象 故不相等 打印false