【发布时间】:2023-03-26 17:00:01
【问题描述】:
我对哈希感到困惑:
当我们使用Hashtable/HashMap(key,value)的时候,首先我知道内部数据结构是一个数组(已经分配在内存中)。
Java hashcode() 方法有一个 int 返回类型,所以我认为这个哈希值将用作数组的索引,在这种情况下,我们应该在 RAM 中的数组中有 2 个 32 次方条目,这不是实际发生了什么。
那么 Java 是否从范围较小的 hashcode() 中创建索引?
答案:
正如这些人在下面和文档中指出的那样:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/HashMap.java
HashMap 是一个数组。 hashcode() 再次重新散列,但仍然是整数,数组中的索引变为:h & (length-1);所以如果数组的长度是 2^n 那么我认为索引从重新散列值中获取第一个 n 位。
【问题讨论】:
-
标准 Java API 没有
HashTable类型。你的意思是Hashtable? -
@LewBloch 是哈希表
-
"在 java hashcode() 方法有一个 int 返回类型,所以理论上我们应该已经为 RAM 中的数组保留了 2 次方 32(即 4 个 Giga 条目)" - 我没有看到你的推理在这里。
-
@JonSkeet 嗨。请检查上面的更新。
-
更新没有解释为什么你认为内部数组的大小首先必须是 2^32。您的“理论上如此”暗示了一个您没有解释的合乎逻辑的步骤(这是不正确的)。
标签: java hash hashmap hashtable