2013-02-01 47 views
8

可能重複:
Integer == int allowed in java在java中比較長值

是什麼

Long l1 = 2L; 
if(l1 == 2) 
    System.out.println("EQUAL");       
if(l1.longValue() == 2) 
    System.out.println("EQUAL"); 

他們都被賦予相同的結果,下面的兩個語句之間的區別「EQUAL 「但我的疑問是龍是對象。它是如何平等的?

+3

這是由於[自動拆箱](http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html)。 – assylias

+0

這是因爲Java的自動裝箱和拆箱功能 –

+0

你可以解釋清晰 – PSR

回答

10

因爲這樣做

if(l1 == 2) 

Longl1得到自動拆箱到它的基本類型,long在評論中,已經指出。所以比較是在longint之間。

在第二種情況下,l1.longValue()將返回long值,作爲原始的,由Long對象表示的Long,所以比較將longint之間是一次。回答your comment,看看What is the main difference between primitive type and wrapper class?

關於autoboxing的評論中給出的鏈接很好地涵蓋了這個問題。

+0

ok。現在我明白了。謝謝u – PSR

-1

此行爲通過加寬和裝箱來解釋。

在第一個例子,

if(l1 == 2) 

會發生什麼情況如下:

1:你是一個原始值(INT)比較的包裝(長)編譯器通知,所以它框的原始的,導致:

if (l1 == new Integer(2))

因爲2是一個int(它缺乏末尾的 'L')。

2:現在的編譯器會發現我們是在比較長着一個整數,所以它擴大了整數到長,從而導致:

if (l1 == new Long(new Integer(2))

3:現在我們比較兩個多頭。

另一種情況是更簡單的,這裏的結果是簡單地:

如果(2L == 2)

比較所述原始值,這是允許,即使它們是不同的類型。

+0

不確定你對第一個例子的解釋。我認爲這是'l1'的_unboxing_發生在這裏,而不是'2'的'_boxing_變成'Integer'。如果是這樣,唯一可以解釋'=='操作符返回'true'的東西就是緩存,如果它正在執行'new Integer(2)',那麼這將不是一個有效的解釋。此外,執行'new Long(123456)== 123456'返回'true',它似乎是一個超出緩存範圍的值。 –