首页 > 解决方案 > 使用 hashmap 时,应该避免还是鼓励 hash 冲突?

问题描述

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

标签: javahashmaphashset

解决方案


避免。一个好的散列算法的要点是将散列对象均匀地分布在可用的散列桶上。

考虑退化的情况:

   int hashCode() { return 0; }

这满足了 hashCode 实现的所有技术要求。它也绝对确保碰撞。结果是所有内容都进入同一个存储桶,并且(在典型实现中)您的哈希映射具有与数组列表相同的性能。

另一方面,在大多数情况下,“少数”碰撞不会引起注意。您只是不想在任何一个存储桶中有“太多”条目。

在您的特定情况下,Employee记录可能具有唯一的“员工 ID”。您可以将其用作 hashCode 的唯一内容。如果 id 已经是一个整数,那就更好了。对于 id 模映射大小相同的情况,您会在映射(而不是 hashCode 结果)中遇到冲突,但这无论如何都是不可避免的。


推荐阅读