HashMap中的Key的“规范化”哈希

时间:2018-12-01 10:18:35

标签: java hashmap

HashMap将其数据存储在存储桶中,如下所示:

transient Node<K,V>[] table;

要在HashMap中放置某些内容,我们需要一个hash()函数,该函数返回从0到table.length()范围内的Key的哈希,对吗?

假设我有

String s = "15315";

// Just pasted internal operation. Is it supposed to calcule hash in table.length range?
int h;
int hmhc = (h = s.hashCode()) ^ (h >>> 16);
System.out.println("String native hashCode: "+s.hashCode() + ", HashMap hash: "+hmhc);

这将返回以下内容:

  

字符串本机hashCode:46882035,HashMap哈希:46882360

我们应该有大约256个存储桶(因此Key的哈希值应在0到256之间),但是HashMap中的内部哈希值使我们可以达到46882360。如何将该哈希值“标准化”到我们的范围?我只是在源代码中看不到它。

我看着这个jdk(put()从第610行开始):http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/util/HashMap.java

1 个答案:

答案 0 :(得分:2)

通常,返回的哈希码将根据存储桶数取模。

在您的情况下,它将进入存储桶46882360 % 256 = 56