覆盖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(); } 

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

编辑:我已经更新了我的问题以包含一个long字段。 应该如何在hashCode()处理多long ? 只是让它溢出int

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

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

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

您应该查看ObjecthashCode()方法的文档 。 它列出了哈希码必须满足的内容。

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