2012-10-13 113 views
9

can任何機構都可以解釋輸出中發生了什麼。 如果==用於比較兩個參考。變量它只是檢查其參考,如果他們是相同的,然後它進入如果正文,那麼爲什麼地獄 aa == bb是相等的如果creting靜態方法valueOf()和ee == ff不等於(這是好的)如果創建它的對象使用新的關鍵字?運算符==包裝類對象的不同行爲

static void main(String args[]) 
{ 
    Integer aa = Integer.valueOf("12"); 
    Integer bb = Integer.valueOf("12"); 
    if(aa==bb)System.out.println("aa==bb"); 
    if(aa!=bb)System.out.println("aa!=bb"); 
    Integer ee = new Integer("12"); 
    Integer ff = new Integer("12"); 


    if(ee==ff)System.out.println("ee==ff"); 
    if(ee!=ff)System.out.println("ee!=ff"); 
} 

輸出:

AA BB ==

EE = FF

+0

一個有趣的文章,描述你的問題:http://tech.puredanger.com/2007/02/01/valueof/ –

回答

11

爲對象平等==比較檢查!

由於Integer.valueOf維護整數對象的緩存,值爲-128到127 valueOf(String)返回緩存的對象,因此==比較結果爲true。

Integer a1 = new Integer("12"); 
Integer b1 = new Integer("12"); 
//a1 == b1 returns false because they point to two different Integer objects 

Integer aa = Integer.valueOf("12"); 
Integer bb = Integer.valueOf("12"); 
//aa == bb returns true because they point to same cached object 

對於對象值的comparance始終使用.equals方法中,如int原語,長等可以使用==比較器。

+0

完美的答案。不知道緩存的事情。用127和128檢查以獲得不同的結果。 –

+2

在您的答案「// a == b is true」中不是false,因爲除非我們使用新的String()方法創建String,否則具有相同值的String指向同一個String對象。你可以運行並檢查一次。 –

+0

@Ivar,那麼最好給整數的例子,爲什麼你給人們一個錯誤的答案?由於這個答案的答案是最高的,所以人們會認爲它是正確的,但是實際上聲明(// a == b是錯誤的)是錯誤的。你想讓我粘貼一個截圖嗎?看我不會建議編輯,但更好地改變答案。我不知道人們如何在沒有閱讀完整答案的情況下簡單地提出答案,也不知道沒有檢查答案是否正確。如果我改變了代碼,那麼我必須改變整個答案。這就像刪除完整的代碼。 –

3

因爲Integer.valueOf保持整數緩存從-128127

這裏是valueOf的源代碼,你可以清楚地看到,它返回同一個對象,如果整數值爲

所以-128127之間

public static Integer valueOf(int i) { 
    if(i >= -128 && i <= IntegerCache.high) 
     return IntegerCache.cache[i + 128]; 
    else 
     return new Integer(i); 
} 
您的 ==返回true。如果價值超過那個,那麼它總是會讓你失望。

Integer aa = Integer.valueOf("1200"); 
    Integer bb = Integer.valueOf("1200"); 
    aa == bb --> false 

你應該使用equals方法

ee.equals(ff); 

經常檢查平等的。如果你,如果添加另一個下方

if (ee.equals(ff)) 
     System.out.println("ee equals ff"); 

輸出將被

ee equals ff 
1

對於EE和FF兩個對象Integer在堆上創建,因此它們都引用不同的對象,因此在使用==運算符時它們不相等。

1

new Integer("12")創建一個新值爲12的Integer對象。無論您每次做多少次,都要創建一個全新的對象。這就是爲什麼==在第二種情況下不起作用。

JVM爲相信更頻繁使用的值(-128-127)維護Integer對象的緩存。場景後面的Integer.valueOf("12")做的是同樣的事情(new Integer("12")),但在這之前它會檢查那個緩存,如果這個值已經存在於緩存中,那麼它會返回它,否則它會創建一個新的緩存,增加它到緩存並返回它。這就是爲什麼==適用於第一種情況。

此外,對於對象,==不應該用於等式檢查,而應該僅用於身份檢查(例如,查看兩個不同的變量是否指向同一對象)。爲了平等檢查,請始終使用equals方法。

+0

有趣。我不知道緩存的事情......謝謝:) –

+0

不客氣。 :) –

相關問題