关于Java HashMap的实现
为什么容量必须是倍数或2? 为什么在indexFor函数中使用“&”? 为什么要在哈希函数中重新计算哈希,而不是直接使用密钥的哈希代码 我认为这个实现和“算法简介”的描述之间有一些重要的区别 “>>>”是什么意思 谁能给我一些指导吗?如果有人能解释一下散列算法,我将不胜感激。关于Java HashMap的实现,java,hashmap,Java,Hashmap,为什么容量必须是倍数或2? 为什么在indexFor函数中使用“&”? 为什么要在哈希函数中重新计算哈希,而不是直接使用密钥的哈希代码 我认为这个实现和“算法简介”的描述之间有一些重要的区别 “>>>”是什么意思 谁能给我一些指导吗?如果有人能解释一下散列算法,我将不胜感激。 非常感谢 这是一个性能优化。将哈希代码映射到表索引的常用方法是 table_index = hash_code % table_length; %操作符很昂贵。如果table_length是2的幂,则计算: table_
非常感谢 这是一个性能优化。将哈希代码映射到表索引的常用方法是
table_index = hash_code % table_length;
%
操作符很昂贵。如果table_length
是2的幂,则计算:
table_index = hash_code & (table_length - 1);
相当于(更)昂贵的模运算。不要理幕后的人 实际的算法无疑是开发人员“感觉良好”的组合,修复了一些奇怪的退化情况,以及简单的传统(用户通常会对其产生模糊的依赖) 请注意:
Net:只要它能工作并且性能良好,你就不必在意。我知道使用“&”,键可以映射到有限的插槽。对哈希映射中冲突的影响如何?
是无符号右移。Java中的常规>
将保留和传播符号位,并保留负数<代码>>>将在发生移位时用零填充符号位。这就是为什么在旧处理器上学习汇编代码是一个好主意。危险将是Robinson!50%的哈希代码是负数,因此hash\u code%table\u length
可能是负数,从而导致排列BoundsException
。您需要使用Math.abs(hash\u code%table\u length)
来获得可用的(即安全的)index@Bohemian-是的,负数会增加复杂性。这是第二种方法的另一个优点,它可以很好地处理负散列码值。谢谢大家的回答。他们回答了我的问题。
table_index = hash_code & (table_length - 1);
* Applies a supplemental hash function to a given hashCode, which
* defends against poor quality hash functions. This is critical
* because HashMap uses power-of-two length hash tables, that
* otherwise encounter collisions for hashCodes that do not differ
* in lower bits. Note: Null keys always map to hash 0, thus index 0.