微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

比较Java中的双打给出了奇怪的结果

我真的不明白为什么会发生以下情况:
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.

原文地址:https://www.jb51.cc/java/124322.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐