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
答案 0 :(得分:2)
通常,返回的哈希码将根据存储桶数取模。
在您的情况下,它将进入存储桶46882360 % 256 = 56
。