我们如何决定集合的hashCode()方法的最佳实现(假设equals方法已被正确重写)?


当前回答

关于8.blogspot.com,你说过

如果equals()对于两个对象返回true,那么hashCode()应该返回相同的值。如果equals()返回false,那么hashCode()应该返回不同的值

我不同意你的看法。如果两个对象具有相同的hashcode,并不意味着它们是相等的。

如果A等于B,那么A.hashcode必须等于B.hascode

but

如果A.hashcode等于B.hascode,这并不意味着A必须等于B

其他回答

只是一个快速的注释,以完成其他更详细的答案(在代码方面):

如果我考虑如何在java中创建哈希表的问题,特别是jGuru FAQ条目,我相信可以判断哈希代码的其他标准是:

同步(算法是否支持并发访问)? 失败安全迭代(算法是否检测到迭代过程中发生变化的集合) 空值(哈希码是否支持集合中的空值)

我更喜欢使用实用工具方法从谷歌集合库从类对象,帮助我保持我的代码干净。equals和hashcode方法通常都是从IDE的模板中创建的,所以它们的可读性不太好。

如果你使用eclipse,你可以使用以下方法生成equals()和hashCode():

生成hashCode()和equals()。

使用此函数,您可以决定使用哪些字段进行相等和散列代码计算,Eclipse将生成相应的方法。

当组合哈希值时,我通常使用boost c++库中使用的组合方法,即:

seed ^= hasher(v) + 0x9e3779b9 + (seed<<6) + (seed>>2);

这在确保平均分配方面做得相当好。有关这个公式如何工作的一些讨论,请参阅StackOverflow的帖子:boost::hash_combine中的魔术数字

在http://burtleburtle.net/bob/hash/doobs.html上有关于不同哈希函数的很好的讨论

关于8.blogspot.com,你说过

如果equals()对于两个对象返回true,那么hashCode()应该返回相同的值。如果equals()返回false,那么hashCode()应该返回不同的值

我不同意你的看法。如果两个对象具有相同的hashcode,并不意味着它们是相等的。

如果A等于B,那么A.hashcode必须等于B.hascode

but

如果A.hashcode等于B.hascode,这并不意味着A必须等于B