我想考「==」操作上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空間中,並將它們的地址提供給Long
s,並且將上述範圍外的所有內容都存儲在代碼中爲每個靜態值創建的新分配。
我接近了嗎?在什麼情況下我們必須意識到類似的行爲?
PS。我知道我應該使用null
檢查,然後.equals()
來比較對象,但我很好奇,如果有人知道答案。
編輯
後jtahlborn的回答誰給我的關鍵字自動裝箱我發現與well-documented answer
是的,你是對的。 (是的,在這裏使用'=='而不是'.equals'是一種罪行。) – 2012-08-14 18:00:50
http://stackoverflow.com/questions/11955958/with-abstract-datatypes-different-results-for-the-same-條件/ 11955984#11955984 – kosa 2012-08-14 18:06:22
您不應該使用空檢查。零檢查是邪惡的。只是不要使用NULL。 – 2013-11-10 07:57:29