我真的无法理解为什么会发生以下情况:
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
我确信这在某种程度上与自动装箱有关,但我真的不知道why 0
当==
使用运算符并且何时.equals
叫做.
这不是隐含地违反了equals
合同 ?
* It is reflexive: for any non-null reference value
* x, x.equals(x) should return
* true.
EDIT:
感谢您的快速答复。我认为它的装箱方式不同,真正的问题是:why包装盒不同吗?我的意思是,如果d == 0d
than d.equals(0d)
是直观且符合预期的,但是如果d == 0
这看起来像一个Integer
is true
而不是“直觉地”d.equals(0)
也应该是真的。
只需将其更改为
System.out.println(d.equals(0d)); // is false ?! now true
您正在比较 double 与Integer
0
在盖子下面
System.out.println(d.equals(0)); // is false ?!
0
将被自动装箱到Integer
并且 Integer 的实例将被传递给equals()
的方法Double
类,它将比较像
@Override
public boolean equals(Object object) {
return (object == this)
|| (object instanceof Double)
&& (doubleToLongBits(this.value) == doubleToLongBits(((Double) object).value));
}
它将返回false当然。
Update
当你使用进行比较时==
它比较值,因此不需要自动装箱,它直接对值进行操作。在哪里equals()
接受Object
所以如果你尝试调用d1.equals(0)
, 0
不是对象,因此它将执行自动装箱并将其打包为作为对象的 Integer。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)