請說明以下情況:爲什麼雙倍「==」和「等於」雙倍?
double d3=(double) 1;
Double d4=new Double(1);
System.out.println(d4==d3); // true
System.out.println(d4.equals(d3)) // true
爲什麼這兩個打印true
的?
請說明以下情況:爲什麼雙倍「==」和「等於」雙倍?
double d3=(double) 1;
Double d4=new Double(1);
System.out.println(d4==d3); // true
System.out.println(d4.equals(d3)) // true
爲什麼這兩個打印true
的?
從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 == d4
是false
,因爲它們是不同的「參考」;然而,基本類型永遠不能作爲引用,所以任何與基本類型相等的比較都需要轉換爲該基本類型。我們可以從the JLS rules regarding object equality in 15.21.3看到:
如果相等運算符的操作數兩者都被引用類型或空類型,那麼操作對象相等。
這是發生對象平等的唯一情況,它不包含基元類型。
謝謝。它有助於me.in addion。請詳細說明兩個表達的機制。 Double d3 =(double)1; \t \t double d4 = new Double(1); – 2014-09-25 03:26:51
@LêQuốcÂn我不確定你的意思 - 隨時創建一個新的問題,並從這裏鏈接到它。 – 2014-09-25 03:32:46
double
是基本類型,而Double
是充當包裝一個double
周圍的類。 (這就是爲什麼,例如,如果你試圖使用d3.equal
,你會得到一個錯誤)爲了方便起見,比較兩個工作,就像你期待的那樣,只是考慮它們的數值;在這種情況下,因爲它們都是1,所以它們被認爲是相等的。
這有什麼奇怪的? – 2014-09-25 03:03:20
你需要提出更具體的問題,而不是「爲什麼這樣?」 – 2014-09-25 03:04:08
您需要閱讀[autoboxing](http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html)。 – azurefrog 2014-09-25 03:06:15