【发布时间】:2012-04-18 00:23:21
【问题描述】:
我有一个不可变对象,例如笛卡尔空间中的一个节点。该类是不可变的,因此我缓存了hashCode 以实现非常快速的散列。
private final int hashCode;
private final double x, y, z;
public Node(final double x, final double y, final double z)
{
this.x = x;
this.y = y;
this.z = z;
this.hashCode = Objects.hashCode(this.x, this.y, this.z);
}
@Override
public boolean equals(final Object obj)
{
if (this == obj) { return true; }
if (obj == null) { return false; }
if (!(obj instanceof Node)) { return false; }
final Node other = (Node) obj;
return Objects.equal(this.x, other.x) && Objects.equal(this.y, other.y) && Objects.equal(this.z, other.z);
}
@Override
public int hashCode()
{
return this.hashCode;
}
由于hashCode 是唯一的并且依赖于类的所有字段并且该类是不可变的,因此仅基于hashCode 检查Node 相等性是否正确?
@Override
public boolean equals(final Object obj)
{
if (this == obj) { return true; }
if (obj == null) { return false; }
if (!(obj instanceof Node)) { return false; }
final Node other = (Node) obj;
return this.hashCode == other.hashCode;
}
这通过了我编写的关于equals() 和hashCode() 的属性及其交互的所有单元测试,但也许我缺少一些东西?
注意:Objects.hashCode() 和 Objects.equal() 是对各自方法有帮助的 Guava 类。
【问题讨论】:
-
跟着我重复:哈希码不是唯一的。
-
顺便说一句,您的第二个
if是第三个的子集。 -
作为参考,这里也提到了:stackoverflow.com/a/7417858/713659,您可以在进行更昂贵的相等检查之前先检查 hashCode,但不能跳过其他检查。
-
仅供参考,没有必要在
equals实现中使用Objects.equal,因为您正在比较原语。==会更快更简单。 -
这种情况下基本等价于
Objects.equal。
标签: java equals immutability guava hashcode