2012-08-14 201 views
6

我想考「==」操作上Long S和這是我發現:下面的代碼:這種奇怪的Java行爲的原因是什麼?

public static void main(final String[] args) { 
    final Long n = 0L; 
    final Long m = 0L; 
    System.out.println(n + " == " + m + " : " + (n == m)); 

    final Long a = 127L; 
    final Long b = 127L; 
    System.out.println(a + " == " + b + " : " + (a == b)); 

    final Long A = 128L; 
    final Long B = 128L; 
    System.out.println(A + " == " + B + " : " + (A == B)); 

    final Long x = -128L; 
    final Long y = -128L; 
    System.out.println(x + " == " + y + " : " + (x == y)); 

    final Long X = -129L; 
    final Long Y = -129L; 
    System.out.println(X + " == " + Y + " : " + (X == Y)); 
} 

輸出:

0 == 0 : true 
127 == 127 : true 
128 == 128 : false 
-128 == -128 : true 
-129 == -129 : false 

唯一的解釋我能來JVM將[-128, 127]中的所有long值存儲在Perm空間中,並將它們的地址提供給Longs,並且將上述範圍外的所有內容都存儲在代碼中爲每個靜態值創建的新分配。

我接近了嗎?在什麼情況下我們必須意識到類似的行爲?

PS。我知道我應該使用null檢查,然後.equals()來比較對象,但我很好奇,如果有人知道答案。

編輯

jtahlborn的回答誰給我的關鍵字自動裝箱我發現與well-documented answer

+5

是的,你是對的。 (是的,在這裏使用'=='而不是'.equals'是一種罪行。) – 2012-08-14 18:00:50

+1

http://stackoverflow.com/questions/11955958/with-abstract-datatypes-different-results-for-the-same-條件/ 11955984#11955984 – kosa 2012-08-14 18:06:22

+0

您不應該使用空檢查。零檢查是邪惡的。只是不要使用NULL。 – 2013-11-10 07:57:29

回答

1

-128 to +127將被評估爲真使用==運營商,如果你是comparing object references。 Long值(從-128到+127)放入緩存中並多次返回,而較高和較低的數字每次都會生成new Long

這也適用於原始包裝類Integer, Float。嘗試整數和浮點。

+1

下來選民需要說明! – 2012-08-14 18:03:51

+1

我不是downvoter,但我覺得它需要什麼樣的外籍人士如何-128 t0 127將是真實的? – kosa 2012-08-14 18:10:28

+0

down投票答案更新.. – 2012-08-14 18:23:26

3

Long具有用於從值-128到127一個內部高速緩存,如果你創建Long通過Long.valueOf(long)方法或在此區間自動裝箱你總是收到相同的對象爲等於值。這就是爲什麼'=='適用於你的例子中的0,127和-128的原因。

如果您在[-128,127]之外創建了Long,則始終將創建新實例(如果是Long對象)。 這就是爲什麼'=='不適用於128和-129。

看看Long.valueOf(long)的源代碼。

相關問題