java - HashMap中Key的"Normalize"哈希值

标签 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);

这将返回以下内容:

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/

相关文章:

python - Ruby 哈希和 Python 字典有什么区别?

java - 从 Objective C 调用 Java 方法

java - 如何显示谷歌自定义搜索结果的下一页?

java - 在 Android 中将 int 转换为 byte

java - 在 iText Java 中添加 map

java - 本地图中的键是一个对象时,如何通过该对象的属性进行搜索?

java - 如何获取在实际进度值之前的seekbar的进度值?

java - 保留 HashMap 中的插入顺序和教程示例

generics - 作为使用关联类型的特征的结构成员

Java 根据值对 Hashmap 进行排序