java - 使用 hashmap 时,应该避免还是鼓励 hash 冲突?
问题描述
如果我正在编写一个Employee
类,它将保存在一些基于哈希的集合中,如 hashmap/hashset。Employee
对象实现应该int hashcode()
避免还是鼓励散列冲突?特别是对于性能 wrt 插入和检索
解决方案
避免。一个好的散列算法的要点是将散列对象均匀地分布在可用的散列桶上。
考虑退化的情况:
int hashCode() { return 0; }
这满足了 hashCode 实现的所有技术要求。它也绝对确保碰撞。结果是所有内容都进入同一个存储桶,并且(在典型实现中)您的哈希映射具有与数组列表相同的性能。
另一方面,在大多数情况下,“少数”碰撞不会引起注意。您只是不想在任何一个存储桶中有“太多”条目。
在您的特定情况下,Employee
记录可能具有唯一的“员工 ID”。您可以将其用作 hashCode 的唯一内容。如果 id 已经是一个整数,那就更好了。对于 id 模映射大小相同的情况,您会在映射(而不是 hashCode 结果)中遇到冲突,但这无论如何都是不可避免的。
推荐阅读
- python - Flask-Admin:分配前引用的局部变量“admin”
- hadoop - 无法在 Windows 10 上找到或加载主类 org.apache.hadoop.util.RunJar
- hive - 如何使用 Hive 处理所有 Hbase 数据
- rust - 为什么通过提取方法进行重构会触发借用检查器错误?
- python - 使用枕头的图像处理代码中的问题
- javascript - 图像数组中的 foreach 元素
- linux - 检查 linux 上活动的任何屏幕会话
- jquery - Angular5 jQuery 指令 - 导入期间未定义 UI
- php - 如何使用 codeigniter 更新表中的确切行
- c# - \MSBuild\16.0\Bin\Microsoft.CSharp.targets 文件未找到