比较Java中的双打给出了奇怪的结果
发布时间:2020-12-14 16:46:27 所属栏目:Java 来源:网络整理
导读:我真的不明白为什么会发生以下情况: Double d = 0.0;System.out.println(d == 0); // is trueSystem.out.println(d.equals(0)); // is false ?! 然而,这是按预期的方式工作: Double d = 0.0;System.out.println(d == 0.0); // trueSystem.out.println(d.eq
我真的不明白为什么会发生以下情况:
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 我很肯定这是与某些方式的autoboxing有关,但我真的不知道为什么0将被使用不同的方式使用==运算符和.equals被调用时. 这不是隐含地违反了平等合同吗? * It is reflexive: for any non-null reference value * x,x.equals(x) should return * true. 编辑: 感谢您的快速答案.我认为它是不同的盒子,真正的问题是:为什么它盒装不同?我的意思是说,如果d == 0d比d.equals(0d)是直观和预期的,那么这将是比较直观的,但是如果d == 0看起来像一个整数是真的比“直观的”d.equals(0)也应该是真实的. 解决方法
只是改变它
System.out.println(d.equals(0d)); // is false ?! now true 你正在和Integer 0进行比较 在封面下 System.out.println(d.equals(0)); // is false ?! 0将被自动装箱为整数,并且Integer的一个实例将被传递给Double类的equals()方法,它将比较像 @Override public boolean equals(Object object) { return (object == this) || (object instanceof Double) && (doubleToLongBits(this.value) == doubleToLongBits(((Double) object).value)); } 当然会返回假的. 更新 当你使用==进行比较时,它比较值,所以不需要autobox,它直接对值进行操作.其中equals()接受Object,所以如果您尝试调用d1.equals(0),则0不是Object,因此它将执行自动装箱,并将其打包为Integer,它是一个Object. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |