[英]Difference between double and Double in comparison
我知道Double
是一個包裝類,它包裝double
數。 今天,我看到了另一個主要區別:
double a = 1.0;
double b = 1.0;
Double c = 1.0;
Double d = 1.0;
System.out.println(a == b); // true
System.out.println(c == d); // false
對我來說太奇怪了!!!
所以,如果我們使用Double
,每次都必須這樣做:
private static final double delta = 0.0001;
System.out.println(Math.abs(c-d) < delta);
我無法解釋為什么 Double 直接比較是錯誤的。 請為我解釋。
c
和d
在技術上是兩個不同的對象,而==
運算符只比較引用。
c.equals(d)
更好,因為它比較值,而不是參考。 但還是不理想。 直接比較浮點值應始終考慮一些錯誤(epsilon)( Math.abs(c - d) < epsilon
)。
注意:
Integer c = 1;
Integer d = 1;
這里比較會產生true
,但這更復雜( Integer
內部緩存,在Integer.valueOf()
JavaDoc中描述):
此方法將始終緩存 -128 到 127(含)范圍內的值,並且可能緩存此范圍之外的其他值。
為什么是valueOf()
? 因為這個方法隱式用於實現自動裝箱:
Integer c = Integer.valueOf(1);
Integer d = Integer.valueOf(1);
當應用於類類型的表達式時, ==
將始終執行引用比較( JLS 第 15.21.3 節)。 所以這一行:
System.out.println(c == d);
正在檢查c
和d
是否引用相同的對象。 Java 中的自動裝箱總是(我相信)為float
和double
創建一個新對象(整數類型1的情況更復雜)。 因此c
和d
指的是不同的對象,因此它打印false
。
如果要比較對象是否相等,則需要顯式調用equals
:
System.out.println(c.equals(d));
對於double
,它使用數字相等代替 - 如第 15.21.1 節中所述。 因此,行為上的差異。
1對於完整的自動裝箱,“小”值被緩存 - 所以自動裝箱 5(比如說)每次都會返回相同的引用。 “小”的定義是特定於實現的,但保證在 -128 到 127 的范圍內。有關詳細信息,請參閱第 5.1.7 節的底部。
使用equals()
檢查 2 個對象的相等性。 ==
檢查 2 個引用是否指向內存中的同一個對象。
檢查原始類型時,內容檢查僅對==
可靠。 對於對象類型,最好使用equals
方法:
c.equals(d)
==
和equals
區別
在原始數據類型上使用==
與在對象引用數據類型上使用它不同。
==
用作equals
。==
指的是它們的引用。 因此對象指向內存中的內容。考慮案例 1
double d1 = 10.00;
double d2 =10.00;
System.out.println(d1 == d2);
*輸出是* true
情況 2: ==
引用數據類型
Double d1 = 10.00;
Double d2 =10.00;
System.out.println(d1 == d2);
*輸出是* false
d1 和 d2 具有不同的內存引用。
要檢查它的有效性,請考慮以下代碼
Double d1 = 10.00;
Double d2 = d1;
System.out.println(d1 == d2);
這將打印true
因為 d1 和 d2 指向相同的內存引用。
所以
Java
使用==
來比較原語並檢查兩個變量是否指向同一個對象
‘等於’
用於檢查兩個objects
是否相等。
它還取決於它被調用的對象的實現。 對於Strings
, equals()
檢查其中的字符。
Double d1 = 10.00;
Double d2 = 10.00;
System.out.println(d1.equals(d2));
打印為true
因為它查看 d1 和 d2 中的內容。
情況 1不會編譯
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.