先看一個例子:
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再去比較;