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);
这将返回以下内容:
String native hashCode: 46882035, HashMap hash: 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
最佳答案
通常,返回的哈希码将以桶数为模。
在您的情况下,它将进入存储桶 46882360 % 256 = 56
。
关于java - HashMap中Key的"Normalize"哈希值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53569796/