java - Java中HashMap的内部实现
问题描述
我正在尝试HashMap()
在 Java 中创建 a 的数据结构。HashMap 必须为最多的N = 1000
操作工作,并且键只是正整数。我所做的是以下内容:
class MyHashMap {
final ListNode[] nodes = new ListNode[1000];
// "put", "get" and "remove" methods which take
// collisions into account using "chaining".
}
为了决定我的新键值对的位置,nodes
我总是需要计算一个索引。我使用的功能:
public int getIndex(int key) { return Integer.hashCode(key) % nodes.length;}
0
它返回一个介于和之间的整数nodes.length
。但是我怎样才能在Java中自己编写一个哈希函数,将整数映射到某个索引而不使用Integer.hashMap(key)
?程序也很好,我真的不需要代码。
解决方案
散列int
值的一个简单策略是乘以一个大常数。如果您不使用常数,则根据您的密钥分配,您可能会获得非常差的冲突率。仍然有可能获得较差的密钥分布,但是对于真实数据来说不太可能。
注意:除非您知道密钥不能为负数,否则应使用Math.abs
以确保它是非负数。
static final int K = 0x7A646E4D; // some large prime.
public int getIndex(int key) {
return Math.abs(key * K % nodes.length);
}
更快的解决方案是放弃使用%
乘法和移位。例如
public int getIndex(int key) {
return (int) ((key * K & 0xFFFF_FFFFL) * nodes.length >>> 32);
}
这会key * K
变成分数并且比使用更快%
推荐阅读
- java - 跨多个应用程序同步 Apache 负载均衡器数据
- php - 使用 PHP cURL 从网站获取一些文本并存储在 MySQL 中
- r - GAMLSS 错误:工作向量中的 NA 或参数 mu 的权重
- html - 无法构建 html/css 内联表单
- autocomplete - zsh 自动补全似乎只适用于内置命令
- sql - 使用雪花 sql 将多行展平为 1 行
- c# - 文件处理 - 异常对象为空
- electron - 电子打包程序不加载图标
- development-environment - 节目不停歇
- python - 如何在 Python 中使用 matplotlib 将时间序列数据与日期作为列映射?