Kyr*_*tar 13 java eclipse equals hashcode
我正在写一个类Vec2D
,代表一个二维向量.我存储x
和y
在double
秒.
当被要求生成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;
}
Run Code Online (Sandbox Code Playgroud)
什么是意义Double.doubleToLongBits(x)
在这方面?我不能简单地写x != other.x
吗?
Jef*_*ica 12
简短回答:Eclipse使用Double.doubleToLongBits,因为这就是Double.equals的作用:
结果是
true
当且仅当参数不是null
并且是一个Double对象,表示doubl
与double
该对象表示的值相同的e .为此,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时.
正如您所看到的,可以将两个double值进行比较,==
但实际上对应于在数学和哈希表中使用时的不同行为.因此,在编写生成的相等方法时,Eclipse假设两个双精度只相等,当且仅当所有可以对它们执行的操作相同时,或者(等效地)如果它们被自动装箱并与它们的equals
方法进行比较.如果之间的切换,这一点尤其重要double
和Double
-它是特别出乎意料的平等性质的不同之处.
当然,你可以自由从假设到漂流:无论它是否是一个好主意,你可以指定特殊的情况下,以任何许多可能的NaN表示,在这种情况下,Double.doubleToRawLongBits()
将是您更好的匹配equals
和hashCode
方法.出于同样的原因,您的用例可能会将+0.0和-0.0的对象视为等效,并保证NaN值不可能,在这种情况下,原始==
比较可能更好equals
(但此时仿真相同的标准hashCode
变得困难) ).
因为==
并!=
遵循 IEEE-754 双打语义,Double.NaN != Double.NaN
并且0.0 == -0.0
. 这些行为可能不是您想要的,因此Double.doubleToLongBits()
将 64 位double
数据转换为 64 位数据,long
以便位移和 XOR 等操作起作用。
不过,老实说,我会说doubleToLongBits
这里的使用是一个错误,因为如果您关心完全相等,您应该使用Double.doubleToRawLongBits()
(它根本不对double
数据执行任何转换)。
归档时间: |
|
查看次数: |
5919 次 |
最近记录: |