簡體   English   中英

比較 double 和 Double 之間的區別

[英]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 直接比較是錯誤的。 請為我解釋。

cd在技​​術上是兩個不同的對象,而==運算符只比較引用。

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); 

正在檢查cd是否引用相同的對象。 Java 中的自動裝箱總是(我相信)為floatdouble創建一個新對象(整數類型1的情況更復雜)。 因此cd指的是不同的對象,因此它打印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區別

在原始數據類型上使用==與在對象引用數據類型上使用它不同。

  1. 在原始數據類型上==用作equals
  2. 對於對象引用數據類型==指的是它們的引用。 因此對象指向內存中的內容。

考慮案例 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是否相等。

它還取決於它被調用的對象的實現。 對於Stringsequals()檢查其中的字符。

    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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM