简短答案:Eclipse使用
Double.doubleToLongBits,因为这就是Double.equals的作用:
结果是,
true当且仅当参数不是,null并且是一个Double对象,该对象表示与该对象表示的doubl值相同的edouble。为此,double当且仅当该方法应用于每个值时doubleToLongBits(double)返回相同的long值时,两个值才被视为相同。
长答案:JLS指定Double.equals和==之间的一些区别。对于JLS
4.2.3和JLS
15.21.1中指定的一个区别:
正零和负零比较相等;因此,表达式的结果
0.0==-0.0为true和的结果0.0>-0.0为false。但是其他运算可以区分正零和负零;例如,1.0/0.0具有正无穷大的值,而1.0/-0.0具有负无穷大的值。
另一个方面
NaN:
如果任一操作数为NaN,则结果为
==为,false但结果!=为true。确实,检验
x!=x是true当且仅当x的值为NaN时。
如您所见, 当在数学表和哈希表中使用 两个双精度值时==
, 它们可能会比较, 但实际上对应于不同的行为
。因此,在编写生成的相等方法时,Eclipse假定两个双精度仅在且仅当可以对它们执行的所有操作都相同,或者(等效地)自动装箱并与其
equals方法进行比较时才相等。如果在
double和之间切换,这一点尤其重要
Double-相等属性在那里差异会特别令人意外。
当然,您可以自由地摆脱这种假设:不管这是一个好主意,您都可以将特殊情况分配给许多可能的NaN表示形式,在这种情况下,这
Double.doubleToRawLongBits()将是您
equals和
hashCode方法更好的匹配方式。同样,您的用例可能会将+0.0和-0.0的对象视为等效对象,并保证不可能使用NaN值,在这种情况下,原始
==比较可能会更好
equals(但是在这一点上,模拟相同的条件
hashCode变得很困难)。



