先看一个例子:
public static void main(String[] args) {
int i1 = 128;
Integer i2 = 128;
Integer i3 = new Integer(128);
System.out.println(i1 == i2);//true
System.out.println(i1 == i3);//true
System.out.println("**************************************");
Integer i4 = 127;
Integer i5 = 127;
Integer i6 = 128;
Integer i7 = 128;
System.out.println(i4 == i5);//true
System.out.println(i6 == i7);//false
System.out.println("**************************************");
Integer i8 = new Integer(127);
Integer i9 = new Integer(127);
System.out.println(i8 == i9);//false
System.out.println(i8.equals(i9));//true
System.out.println(i4 == i8);//false
}
/* Output:
true
true
**************************************
true
false
**************************************
false
true
false
*/
解析:第5和第6行的结果都为true。因为Integer和int比较时,Integer会自动拆箱(jdk1.5以上)。
第12行结果为true,第13行结果为false。因为Java在编译的时候,Integer i4=127被编译成-->Integer i4 = Integer.valueOf(127);
查看JDK源码:
public static Integer valueOf(int i){
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
得知,对于-128到127之间的数,会进行缓存,Integer i6 = 127时,会将127进行缓存,下次再写Integer i7 = 127时,就会直接从缓存中取,就不会新new对象了。
i8、i9使用的是new,对象不一样,所以第17行结果为false,第18行结果为true,第19行为false。
总结:
1、Integer是int的包装类,int的初始值为0,Integer的初始值为null;
2、无论如何,Integer和new Integer()不会相等。不会经历拆箱过程,i8的引用指向堆,而i4指向专门存放他的内存(常量池),他们的内存地址不一样,使用== 比较都为false。
3、两个非new出来的Integer,使用==比较,如果在-128到127之间,则是true,否则为false;
4、两个都是new出来的Integer,==比较都为false。若要比较值是否相等,需使用equals()方法进行比较;
5、int和Integer(无论是否是new出来的)比较,都为true,因为Integer会自动拆箱为int再去比较;