覆盖hashCode() - 这还不错吗?

时间:2010-12-14 17:27:37

标签: java equals hashcode

对于其字段完全是原始的类,例如:

class Foo
{
    int a;
    String b;
    boolean c;
    long d;

    boolean equals(Object o)
    {
        if (this == o) return true;
        if (!(o instanceof Foo)) return false;
        Foo other = (Foo) o;
        return a == other.a && b.equals(other.b) && c == other.c && d = other.d;
    }
}

这是一种合理的“足够好”的方式来撰写hashCode()吗?

boolean hashCode()
{
    return (b + a + c + d).hashCode();
}

也就是说,我使用String使用的相同字段构建equals(),然后使用String#hashCode()

修改:我已将我的问题更新为包含long字段。如何在long中处理hashCode()?只是让它溢出int

2 个答案:

答案 0 :(得分:7)

您的哈希代码确实满足以下属性:如果两个对象相等,则它们的哈希码必须相等。所以,通过这种方式,它“足够好”。但是,在哈希码中创建冲突相当简单,这会降低基于哈希的数据结构的性能。

我会以稍微不同的方式实现它:

public int hashCode() {
    return a * 13 + b.hashCode() * 23 + (c? 31: 7);
}

您应该查看Object的{​​{3}}。它列出了哈希码必须满足的内容。

答案 1 :(得分:0)

这完全取决于您的数据是什么样的。在大多数情况下,这将是一个很好的方法。如果您经常以b结尾有一个数字,那么您将获得一些不等对象的重复代码,正如JacobM的答案所示。如果你提前知道b最后几乎没有数字值,那么这是一个合理的散列算法。