Integer與int的區別我們耳熟詳的有兩點:1.Integer是int的包裝類。2.Integer的默認初始值是null,而int的默認初試值是0。
下面通過代碼進行詳細比較。
1 public class TestInteger { 2 3 public static void main(String[] args) { 4 int i = 128; 5 Integer i2 = 128; 6 Integer i3 = new Integer(128); 7 //Integer會自動拆箱為int,所以為true 8 System.out.println(i == i2); //true 9 System.out.println(i == i3); //true 10 System.out.println("**************"); 11 Integer i5 = 127;//java在編譯的時候,被翻譯成-> Integer i5 = Integer.valueOf(127); 12 Integer i6 = 127; 13 System.out.println(i5 == i6);//true 14 /*Integer i5 = 128; 15 Integer i6 = 128; 16 System.out.println(i5 == i6);//false 17 */ Integer ii5 = new Integer(127); 18 System.out.println(i5 == ii5); //false 19 Integer i7 = new Integer(128); 20 Integer i8 = new Integer(128); 21 System.out.println(i7 == i8); //false 22 } 23 24 }
第8行和第9行的結果都是true,因為Integer會拆箱為int(jdk 1.5以上)。
什么時候會拆箱?——基本數據類型和引用數據類型做運算時
什么時候會裝箱?——基本數據類型賦值給引用數據類型的時候
第13行的結果為true,而第16行的結果為false。很奇怪~因為java在編譯Integer i5=127的時候,被翻譯成Integer i5=Integer.valueOf(127);
所以關鍵就是看valueOf()函數了。JDK源碼的valueOf()是這樣的:
1 public static Integer valueOf(int i) { 2 assert IntegerCache.high >= 127; 3 if (i >= IntegerCache.low && i <= IntegerCache.high) 4 return IntegerCache.cache[i + (-IntegerCache.low)]; 5 return new Integer(i); 6 }
valueOf:public static Integer valueOf(int i) 返回一個表示指定的int值的Integer實例。如果不需要新的Integer實例,則通常應優先使用該方法,而不是構造方法Integer(int),因為該方法有可能通過緩存經常請求的值而顯著提高空間和時間性能。
對於-128到127之間的數,會進行緩存,Integer i5=127時,會將127進行緩存,下次再寫Integer i6=127時,就直接從緩存中取,就不會new了。所以第13行的結果為true,而第16行的結果為false。
對於第18和21行,對象不一樣,都為false。
綜上所述:
①無論如何,Integer和new Integer不會相等。不會經歷拆箱過程,前者指向常量池,后者的引用指向堆。他們的內存地址不一樣。
②兩個都是非new出來的Integer,如果數在-128到127之間,則是true,否則為false。
③兩個都是new出來的,為false。
④int和Integer(無論new 否),都為true,因為會把Integer自動拆箱為int再比較。