是什麼
Long l1 = 2L;
if(l1 == 2)
System.out.println("EQUAL");
if(l1.longValue() == 2)
System.out.println("EQUAL");
他們都被賦予相同的結果,下面的兩個語句之間的區別「EQUAL 「但我的疑問是龍是對象。它是如何平等的?
是什麼
Long l1 = 2L;
if(l1 == 2)
System.out.println("EQUAL");
if(l1.longValue() == 2)
System.out.println("EQUAL");
他們都被賦予相同的結果,下面的兩個語句之間的區別「EQUAL 「但我的疑問是龍是對象。它是如何平等的?
因爲這樣做
時if(l1 == 2)
Long
l1
得到自動拆箱到它的基本類型,long
在評論中,已經指出。所以比較是在long
和int
之間。
在第二種情況下,l1.longValue()
將返回long
值,作爲原始的,由Long
對象表示的Long
,所以比較將long
和int
之間是一次。回答your comment,看看What is the main difference between primitive type and wrapper class?
關於autoboxing的評論中給出的鏈接很好地涵蓋了這個問題。
ok。現在我明白了。謝謝u – PSR
此行爲通過加寬和裝箱來解釋。
在第一個例子,
if(l1 == 2)
會發生什麼情況如下:
1:你是一個原始值(INT)比較的包裝(長)編譯器通知,所以它框的原始的,導致:
if (l1 == new Integer(2))
因爲2是一個int(它缺乏末尾的 'L')。
2:現在的編譯器會發現我們是在比較長着一個整數,所以它擴大了整數到長,從而導致:
if (l1 == new Long(new Integer(2))
3:現在我們比較兩個多頭。
另一種情況是更簡單的,這裏的結果是簡單地:
如果(2L == 2)
比較所述原始值,這是允許,即使它們是不同的類型。
不確定你對第一個例子的解釋。我認爲這是'l1'的_unboxing_發生在這裏,而不是'2'的'_boxing_變成'Integer'。如果是這樣,唯一可以解釋'=='操作符返回'true'的東西就是緩存,如果它正在執行'new Integer(2)',那麼這將不是一個有效的解釋。此外,執行'new Long(123456)== 123456'返回'true',它似乎是一個超出緩存範圍的值。 –
這是由於[自動拆箱](http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html)。 – assylias
這是因爲Java的自動裝箱和拆箱功能 –
你可以解釋清晰 – PSR