我真的无法理解为什么会发生以下情况:
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
我很肯定这在某种程度上与自动装箱有关,但我真的不知道为什么在使用运算符和何时调用0
时会以不同的方式装箱==
.equals
。
这不是隐含违反equals
合同吗?
* 它是自反的:对于任何非空引用值 * x, x.equals(x) 应该返回 * 真的。
编辑:
感谢您的快速回答。我认为它的装箱方式不同,真正的问题是:为什么装箱方式不同?我的意思是,如果d == 0d
比d.equals(0d)
直观和预期的更直观,但是如果d == 0
看起来像一个Integer
,那么true
“直观”d.equals(0)
也应该是正确的。