2014-09-25 108 views
-3

請說明以下情況:爲什麼雙倍「==」和「等於」雙倍?

double d3=(double) 1; 
Double d4=new Double(1); 
System.out.println(d4==d3); // true 
System.out.println(d4.equals(d3)) // true 

爲什麼這兩個打印true的?

+2

這有什麼奇怪的? – 2014-09-25 03:03:20

+0

你需要提出更具體的問題,而不是「爲什麼這樣?」 – 2014-09-25 03:04:08

+2

您需要閱讀[autoboxing](http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html)。 – azurefrog 2014-09-25 03:06:15

回答

5

Java Language Specification 15.21.1

如果相等運算符的操作數都是數字型的,或一個是數字型的,另一種是可兌換(§5.1.8),以數字類型,二進制數字對操作數進行提升(第5.6.2節)。

請注意,二進制數值提升執行值集轉換(第5.1.13節)並可能執行拆箱轉換(第5.1.8節)。

拆箱轉換正是這裏發生了什麼:d4是拆箱到它的價值,1.0,然後比較d3的價值,這也是1.0

從你的問題,你似乎期待d3 == d4false,因爲它們是不同的「參考」;然而,基本類型永遠不能作爲引用,所以任何與基本類型相等的比較都需要轉換爲該基本類型。我們可以從the JLS rules regarding object equality in 15.21.3看到:

如果相等運算符的操作數兩者都被引用類型或空類型,那麼操作對象相等。

這是發生對象平等的唯一情況,它不包含基元類型。

+0

謝謝。它有助於me.in addion。請詳細說明兩個表達的機制。 Double d3 =(double)1; \t \t double d4 = new Double(1); – 2014-09-25 03:26:51

+0

@LêQuốcÂn我不確定你的意思 - 隨時創建一個新的問題,並從這裏鏈接到它。 – 2014-09-25 03:32:46

1

double是基本類型,而Double是充當包裝一個double周圍的類。 (這就是爲什麼,例如,如果你試圖使用d3.equal,你會得到一個錯誤)爲了方便起見,比較兩個工作,就像你期待的那樣,只是考慮它們的數值;在這種情況下,因爲它們都是1,所以它們被認爲是相等的。