作者:h619718610 | 来源:互联网 | 2022-11-24 18:47
Foo
如果double成员在另一个对象的给定范围内,则认为类的对象是相等的.由于浮点运算,可以容易地引入这样的错误.
该方法 isDoubleEquals
和doubleArrayEquals
的部分相等,但合同规定哈希码必须是相等的对象相同的会照顾.双精度的默认哈希码不会将close值映射到相同的值,因此为匹配双精度数获取相同哈希值的好方法是什么?
public class Foo {
double[] values;
public Foo(double[] values) {
this.values = values;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
//TODO Arrays.hashCode will not work with the contract
result = prime * result + Arrays.hashCode(values);
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Foo other = (Foo) obj;
if (!doubleArrayEquals(values, other.values,1e-10))
return false;
return true;
}
private boolean doubleArrayEquals(double[] arr, double[] arr2, double epsilon) {
if (arr== arr2)
return true;
if (arr == null || arr2 == null)
return false;
int length = arr.length;
if (arr2.length != length)
return false;
for(int i = 0; i
Andy Turner..
6
你无法正确编写equals
和hashCode
处理近似相等的方法.
equals
要求及物性和近似平等的契约不具有传递性.
这并不是说近似相等不是一个有用的东西:它不是Java equals
(和hashCode
)方法的用途,因此你应该定义自己的方法 - 比如说isApproximatelyEqualTo
- 来支持它,而不会重载着名的Java方法.
1> Andy Turner..:
你无法正确编写equals
和hashCode
处理近似相等的方法.
equals
要求及物性和近似平等的契约不具有传递性.
这并不是说近似相等不是一个有用的东西:它不是Java equals
(和hashCode
)方法的用途,因此你应该定义自己的方法 - 比如说isApproximatelyEqualTo
- 来支持它,而不会重载着名的Java方法.