我真的无法理解为什么会发生以下情况:
Double d = 0.0;
System.out.println(d == 0); // is true
System.out.println(d.equals(0)); // is false ?!
然而,这个例子按预期工作:
Double d = 0.0;
System.out.println(d == 0.0); // true
System.out.println(d.equals(0.0)); // true
我很确定这与自动装箱有关,但我真的不知道为什么当使用`==`运算符和调用`.equals`时,`0`会被不同地装箱。
这不是隐式违反了`equals`协议吗?
* 它是自反的:对于任何非空引用值x, * x.equals(x)应该返回true。
编辑:
谢谢快速回答。我想到它被装箱了,真正的问题是:为什么它被不同地装箱了?我的意思是如果`d == 0d`比`d.equals(0d)`更直观和预期,然而如果`d == 0`看起来像一个`Integer`则为`true`,那么“直观地”`d.equals(0)`也应该为true。
d
是一个对象而 0 是原始类型时,它如何比较值?我认为它要么将d
拆箱(转换为int
?或者可能使用Double.doubleValue()
?),要么装箱 0,否则我不知道它如何对一个对象和一个原始类型执行==
。也许我应该问一个单独的问题,因为这个问题有点复杂... - Simeond.doubleValue() == 0
,请在JLS 5.1.7中了解更多信息。 - jmjd.doubleValue()
。现在我在想这是否是 JVM 实现特定的,但这是另一个话题 :D - Simeon