考虑以下示例:
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/