Java中Integer的詳解

  • 2020 年 1 月 21 日
  • 筆記

在Java中有int和integer兩種類型,簡單的說Integer是int的引用類型,但是這個引用的類型比較特殊,下面看幾個demo:

Integer a1 = 140;  Integer a2 = 140;  System.out.println(a1 == a2);    Integer b1 = 120;  Integer b2 = 120;  System.out.println(b1 == b2);

運行結果是:

false  true

原因: Java對於-128到127之間的數,會進行快取,Integer i = 127時,會將127進行快取,下次再寫Integer j = 127時,就會直節從快取中拿取,不會再從新創建對象

所以120的時候地址是一樣的,運行是true,大於127的時候重新開闢嗎新的地址空間,地址不一致,為false

當然我們也可以強制重新開闢一個新的變數:

Integer c1 = new Integer(120);  Integer c2 = new Integer(120);  System.out.println(c1 == c2);      Integer d1 = new Integer(120);  Integer d2 =  120;  System.out.println(d1 == d2);

運行結果是:

false  false

這樣就更好的驗證了我們上面的想法。

如果用Integer和int的值相比,會怎麼樣呢?

Integer e1 = new Integer(120);  int e2 =  120;  System.out.println(e1 == e2);        Integer f1 = new Integer(140);  int f2 =  140;  System.out.println(f1 == f2);    Integer g1 = 120;  int g2 =  120;  System.out.println(g1 == g2);

運行結果是:

true  true  true

原因: 當Integer和int對比的時候,Integer會自動拆箱成為int進行對比

從上面的結論我們得出:

  1. Integer在小於-128到127可以看似是值類型,超過這個範圍後,會變成引用類型
  2. Integer與int對比的時候會自動拆箱成int,再進行對比

綜合上面,我開始有個一個疑問:

Integer i1 = 140;  Integer i2 = i1;  i1++;  System.out.println(i2);  System.out.println(i2 == i1);

運行結果是:

140  false

為什麼i2沒有隨之i1的值改變而改變?

原因: Integer在進行運算的時候回自動調用內部函數intValue().

上面的程式碼可以拆解成:

Integer i1 = 140;  Integer i2 = i1;  i1=Integer.valueOf(i1.intValue()+1);  System.out.println(i2);  System.out.println(i2 == i1);

根據上面的所有情況,我們可以寫一個終極的值類型和引用類型的轉換:

Integer i1 = 120;  Integer i2 = i1;  Integer i3=i1+1;  Integer i4=i3-1;  System.out.println(i2);  System.out.println(i2 == i4);

運行結果:

120  true

而當i1=140的時候,i2 == i4就會變成false。