在此处查看Java HashMap的实现:http://www.docjar.com/html/api/java/util/HashMap.java.html我注意到以下内容:
使用的内部数据结构是一个数组,在每个索引处存储对链表中第一个条目的引用。数组索引基于密钥的哈希码,链表表示该特定哈希码的桶。 我发现有趣的是方法indexFor(int h,int length),对于给定的密钥,它决定了数组中要查看的桶。但是实现,返回h& (length - 1)看起来很奇怪,对于与给定数组索引不一致的不确定数量的哈希码,该方法将返回0.因此,无论您为对象实现什么唯一哈希码,数组很可能充满了对象,因此您不会从独特的哈希码应该为您提供的内容中受益,即更快的数据访问。
我错过了什么吗?
的Cristian
答案 0 :(得分: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的序列。
答案 1 :(得分:0)
我不太明白你认为问题是什么。
h & (length - 1)
是一种计算h % n
的简单方法,其中n
是2的幂。在我的理解中,没有任何理由可以h % n
给出不自然的大量零。