2016-07-24 118 views
0

我試圖查看Java中某些類型的真正表。Java類型,值比較

而我不能理解方式頂部返回true和一個下面的假?

public class CompareTypes{ 

    public static void main(String[] args){ 

     // ------------------------------------- 
     Integer AA = 12; 
     Integer BB = 12; 
     System.out.println(AA == BB); // true 

     // ------------------------------------- 
     Integer a = 128; 
     Integer b = 128; 
     System.out.println(a == b); // false 


    } 

} 

回答

1

您正在看到一個自動裝箱的神器。

Integer對象具有不同的對象ID,這意味着對於==,兩個不同的Integer對象將是false。但是,valueOf方法會緩存Integer對象的前127個值。當你在-128和+127之間創建Integer時,通過它的valueOf靜態工廠,你可以得到完全相同的對象。當你創建一個值大於等於128的值時,你每次都會得到一個全新的對象,具有不同的ID,因此不會直接響應==調用。

自動裝箱使用valueOf方法做自動裝箱,這就是爲什麼該對象的引用作爲從少於128個工作int文字Integer對象創建。然而,創建兩個Integer值爲128的對象的線會創建兩個不同的對象。

這個故事的寓意是

  • 嘗試使用.equals()值類型
  • 提防文字類型和盒裝類型的混合起來的。

https://blogs.oracle.com/darcy/entry/boxing_and_caches_integer_valueof