有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java“规范化”HashMap中的密钥哈希

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

transient Node<K,V>[] table;

要在HashMap中放入一些内容,我们需要一个hash()函数,它返回从0到table范围内的键的哈希值。长度(),对吗

假设我有:

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个存储桶(所以密钥的哈希值应该在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) 个答案

  1. # 1 楼答案

    通常,返回的散列码将被取为桶数的模

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