考虑以下示例:

public static void main(String[] args) {
    double x1 = 0.0, y1 = -0.0;
    Double a1 = x1, b1 = y1;
    System.out.println(x1 == y1);       //1, true
    System.out.println(a1.equals(b1));  //2, false

    double x2 = 0.0, y2 = 0.0;
    Double a2 = x2, b2 = y2;
    System.out.println(x2 == y2);       //3, true
    System.out.println(a2.equals(b2));  //4, true

    double x3 = 0.0/0.0, y3 = 0.0/0.0;
    Double a3 = x3, b3 = y3;
    System.out.println(x3 != y3);       //5, true
    System.out.println(!a3.equals(b3)); //6, false
}

我试图了解Double的自动装箱功能,但没有。为什么//2打印false,但是//4打印true//1//3都打印true。为什么它们以不同的方式自动装箱?

咨询下面的JLS 5.1.7部分,我意识到它没有具体说明:



那么,//2//4//6是否以未指定的行为出现,并可能根据实现方式而导致不同的结果?

最佳答案

除非另行指定,否则所有JAVA数值类型都经过签名
因此,0.0以二进制形式表示为0000000 ........ 0000000
-0.0表示为
10000000 ........ 0000000
现在,据我了解,当您使用equals()时,比较是从2个内存位置逐位完成的,因此在您的情况下将失败。
从java.lang.Double包Double.equals(Double)实现如下

public boolean equals(Object obj) {
    return (obj instanceof Double)
           && (doubleToLongBits(((Double)obj).value) ==
                  doubleToLongBits(value));
}

关于java - 了解双重自动装箱,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36052241/

10-09 09:28