2012-02-17 51 views
8

可能重複:
Inconsistent behavior on java's ==
Integer wrapper objects share the same instances only within the value 127?Java的==整數

我已經找到了Integer對象以下==行爲,我看不懂。 (我清楚地知道,應該使用等於這樣的比較,但我對OCPJP學習......)

短,如預期的1000 ==作品,而不是10

前的代碼片段是:

Integer i1 = 1000; 
Integer i2 = 1000; 
if(i1 != i2) System.out.println("different objects"); 
if(i1.equals(i2)) System.out.println("meaningfully equal"); 

和它表現爲人們所期望的:

different objects 
meaningfully equal 

後者雖然:

Integer i3 = 10; 
Integer i4 = 10; 
if(i3 == i4) System.out.println("same object"); 
if(i3.equals(i4)) System.out.println("meaningfully equal"); 

具有以下的輸出:

same object 
meaningfully equal 

是否有人可以解釋爲什麼發生這種情況?

+1

BTW用'-XX嘗試:+ AggressiveOpts',第一個將表現爲第二,作爲它增加了Integer緩存的大小。 ;) – 2012-02-17 11:20:05

回答

11

自從Java 5引入包裝類緩存以來。以下是對位於Integer緩存中的內部類IntegerCache創建的緩存的檢查。例如,下面的代碼將創建緩存:其中全部存儲在一個整數數組的-128到127的範圍內被創建

Integer myNumber = 10 

Integer myNumber = Integer.valueOf(10); 

256整型對象。這種緩存功能可以通過查看內部類IntegerCache來查看,它可以在Integer中找到:

因此,當使用Integer.valueOf創建對象或直接將值指定給範圍在-128到127之間的整數時同樣的對象將被返回。因此,考慮下面的例子:

Integer i = 100; 
Integer p = 100; 
if (i == p) 
    System.out.println("i and p are the same."); 
if (i != p) 
    System.out.println("i and p are different."); 
if(i.equals(p)) 
    System.out.println("i and p contain the same value."); 

輸出是:

i and p are the same. 
i and p contain the same value. 

重要的是要注意的是對象i和p,只是因爲他們是同一個對象等同於真正的,比較不基於該值,它基於對象相等。如果整數i和p超出-128或127的範圍,則不使用緩存,因此會創建新對象。在對值進行比較時,請始終使用「.equals」方法。注意實例化一個Integer不會創建這個緩存​​也很重要。

請記住,「==」始終是用於對象的平等,它並沒有被重載比較拆箱值