2013-10-21 45 views
8

我,當我試圖比較2個長變量一個很奇怪的問題,他們總是表現出假的,我可以肯定他們在Eclipse的調試相同數量的值:什麼不是2長變量與==運算符相等以在Java中進行比較?

if (user.getId() == admin.getId()) { 
    return true; // Always enter here 
} else { 
    return false; 
} 

兩個以上2返回值是對象類型Long,這讓我困惑。並驗證我寫了這樣的主要方法:

Long id1 = 123L; 
Long id2 = 123L; 

System.out.println(id1 == id2); 

它打印爲真。

那麼有人可以給我一些想法嗎?我一直在Java開發工作3年,但無法解釋這種情況。

+4

這取決於龍的大小。較小的長整數和整數是插入的,並且是真正相同的對象,但較長的不是,對於這些,您將需要使用'.equals(...)'或unbox它們。 –

回答

17

==比較引用,等於比較值。這兩個Long是Object,因此他們比較引用。

BUT Long id1 = 123L;意志自動地autoboxed使用Long.valueOf(String)內部長整型對象,該過程將使用LongCache, 和123是LongCache [-128,127]之間,因此實際上是相同的對象。

+0

,返回的ID值是16,這個值不超過它的範圍。 –

+0

是的,但那些Longs可能不是由Long.valueOf()創建的,因此它們是新的Long(12),所以它們是不同的對象。 – BlackJoker

+0

運行時實現保證緩存'整數'值-128..127。如果運行時注意到在特定情況下這樣做會有好處,但是該規範沒有說明運行時會有什麼有利的情況,那麼超出該範圍或任何其他數值類型(例如'Long')的值可能被緩存或者不會承認。 – supercat

6

因爲==比較基準值,小long values are cached

public static Long valueOf(long l) { 
    final int offset = 128; 
    if (l >= -128 && l <= 127) { // will cache 
     return LongCache.cache[(int)l + offset]; 
    } 
    return new Long(l); 
} 

所以它適用於較小的長期價值

請參見

+0

但在我的情況下,user.getId()只返回16,我認爲它足夠小。如何解釋它? –

+0

那麼它不會被緩存在'LongCache'中,在我的情況下,http://ideone.com/bq3zpZ –

0

因爲使用==而陷入了4個小時的問題... Long < 128上的比較沒有問題,但ko的值更大。

一般來說,使用==來比較Objects並不是一個好主意,儘可能使用.equals()!對原語保留==, >, <, <= etc.

相關問題