java - Java中HashMap的内部实现

标签 java hashmap hash-function

我正在尝试创建 HashMap() 的数据结构在 java 。 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 值的一个简单策略是乘以一个大常量。如果您不使用常量,则根据您的 key 分配,您可能会得到非常差的冲突率。仍然有可能获得较差的 key 分配,但对于真实数据来说这种可能性较小。

注意:除非您知道 key 不能为负数,否则应使用 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 - Java中HashMap的内部实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53264218/

相关文章:

python - (1) 哈希函数、(2) 签名长度和 (3) jaccard 相似度之间的关系?

java - Maven在eclipse上按F11时自动安装项目

java - 无法在 Java 上加载图像 (BlueJ)

c - 自定义共享 HashMap 实现

arrays - 将数组、标量和散列传递给 Perl 中的子例程

java - 对于java中的不可变对象(immutable对象),浅拷贝是否可以作为深拷贝工作?

java - Java HashMap 如何处理具有相同哈希码的不同对象?

c++ - 提供良好的散列函数

java - 来自字符串的位图

java - 单击对话框时替换另一个 fragment 上方的 fragment (viewpager)