当前位置: 首页 > 面试题库 >

Double.doubleToLongBits(x)的含义

郜俊健
2023-03-14
问题内容

我正在写一个类Vec2D,表示一个二维向量。我存储xydouble

当要求生成equals(Object obj和时hashCode()eclipse生成了以下内容:

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    long temp;
    temp = Double.doubleToLongBits(x);
    result = prime * result + (int) (temp ^ (temp >>> 32));
    temp = Double.doubleToLongBits(y);
    result = prime * result + (int) (temp ^ (temp >>> 32));
    return result;
}
@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Vec2D other = (Vec2D) obj;
    if (Double.doubleToLongBits(x) != Double.doubleToLongBits(other.x))
        return false;
    if (Double.doubleToLongBits(y) != Double.doubleToLongBits(other.y))
        return false;
    return true;
}

什么是意义Double.doubleToLongBits(x)在这方面?我不能简单地写x != other.x吗?


问题答案:

简短答案:Eclipse使用
Double.doubleToLongBits,
因为这就是Double.equals的作用:

结果是,true当且仅当参数不是,null并且是一个Double对象,该对象表示与该对象表示的doubl值相同的e
double。为此,double当且仅当该方法应用于每个值时doubleToLongBits(double)返回相同的long值时,两个值才被视为相同。

长答案:JLS指定Double.equals和==之间的一些区别。对于JLS
4.2.3
和JLS
15.21.1中指定的一个区别:

正零和负零比较相等;因此,表达式的结果0.0==-0.0true和的结果0.0>-0.0false。但是其他运算可以区分正零和负零;例如,1.0/0.0具有正无穷大的值,而1.0/-0.0具有负无穷大的值。

另一个方面NaN

如果任一操作数为NaN,则结果为==为,false但结果!=true

确实,检验x!=xtrue当且仅当x的值为NaN时。

如您所见, 当在数学表和哈希表中使用 两个双精度值时==它们可能会比较, 但实际上对应于不同的行为
。因此,在编写生成的相等方法时,Eclipse假定两个双精度仅在且仅当可以对它们执行的所有操作都相同,或者(等效地)自动装箱并与其equals方法进行比较时才相等。如果在double和之间切换,这一点尤其重要Double-相等属性在那里差异会特别令人意外。

当然,您可以自由地摆脱这种假设:不管这是一个好主意,您都可以将特殊情况分配给许多可能的NaN表示形式,在这种情况下,这Double.doubleToRawLongBits()将是您equalshashCode方法更好的匹配方式。同样,您的用例可能会将+0.0和-0.0的对象视为等效对象,并保证不可能使用NaN值,在这种情况下,原始==比较可能会更好equals(但是在这一点上,模拟相同的条件hashCode变得很困难)。



 类似资料:
  • 问题内容: jQuery和其他框架添加以下标头: X-Requested-With:XMLHttpRequest 为什么需要这个?为什么服务器要对AJAX请求与常规请求区别对待? 更新 :我刚刚找到了一个使用此标头的真实示例:https : //core.spreedly.com/manual/payment-methods/adding- with-js 。如果要求付款处理器不使用AJAX,则完

  • 我有以下X射线过滤器: 它工作得很好,除了我想要这样的东西: 问题是如何编写X射线过滤器/查询,以便URL不包含特定字符串。 谢谢Brian

  • 问题内容: 我想找到一个SQL查询来查找其中field1不包含$ x的行。我怎样才能做到这一点? 问题答案: 这是什么领域?IN运算符不能与单个字段一起使用,而应与子查询或预定义列表一起使用: 如果要搜索字符串,请使用LIKE运算符(但这会很慢): 如果将其限制为要搜索的字符串必须以给定的字符串开头,则可以使用索引(如果该字段上有索引)并且速度相当快:

  • 本文向大家介绍Python程序生成一个字典,该字典包含(x,x * x)形式的数字(1到n之间)。,包括了Python程序生成一个字典,该字典包含(x,x * x)形式的数字(1到n之间)。的使用技巧和注意事项,需要的朋友参考一下 当需要以特定形式生成包含给定范围内的数字的字典时,请从用户处获取输入,并使用简单的“ for”循环。 示例 以下是相同的演示- 输出结果 解释 该数字作为用户输入。 创

  • 基于此,我认为我应该完全开始在中使用