1

在这里查看 Java HashMap 的实现:http: //www.docjar.com/html/api/java/util/HashMap.java.html我注意到以下内容:

使用的内部数据结构是一个数组,它在每个索引处存储对链表中第一个条目的引用。数组索引基于键的哈希码,而链表表示该特定哈希码的存储桶。我发现有趣的是 indexFor(int h, int length) 方法,对于给定的键,该方法确定要查看数组中的哪个桶。但是从某种意义上说,return h & (length - 1) 的实现看起来很奇怪对于与给定数组索引不一致的不确定数量的哈希码,该方法将返回 0。因此,无论您为对象实现什么唯一哈希码,数组中的 0 存储桶很可能会充满对象,因此您不要从应该为您提供的唯一哈希码中受益,即更快的数据访问。

我错过了什么吗?

克里斯蒂安

4

2 回答 2

4

您在 HashMap 源代码中缺少以下 Javadoc:

/**
 * The table, resized as necessary. Length MUST Always be a power of two.
 */
transient Entry<K,V>[] table;

这意味着table.length-1它将始终是一个 1 的序列。

于 2012-10-05T14:30:04.290 回答
0

我不太明白你认为问题是什么。

这是计算哪里是二的幂的h & (length - 1)一种简单方法。在我的理解中,没有任何理由应该给出不自然的大量零。h % nnh % n

于 2012-10-05T14:29:55.490 回答