java—在使用哈希Map时,是否应该避免或鼓励哈希冲突?

wmomyfyw  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(372)

如果我在写 Employee 类,该类将保存在一些基于哈希的集合中,如hashmap/hashset。应该 Employee 对象 int hashcode() 实现避免或鼓励哈希冲突?特别是对于性能w.r.t插入和检索

w8f9ii69

w8f9ii691#

避免。好的散列算法的要点是将散列对象均匀地分布在可用的散列桶上。
考虑退化情况:

int hashCode() { return 0; }

这满足了hashcode实现的所有技术要求。它也绝对保证了碰撞。结果是所有内容都进入同一个bucket,并且(在典型的实现中)哈希Map的性能与数组列表相同。
另一方面,在大多数情况下,“少数”碰撞并不明显。你只是不想在任何一个bucket中有太多的条目。
在你的特殊情况下 Employee 记录可能具有唯一的“雇员id”。您可以将其用作哈希代码的唯一内容。如果id已经是整数就更好了。对于id模Map大小相同的情况,会在Map(而不是hashcode结果)中发生冲突,但无论如何这是不可避免的。

相关问题