Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于Java HashMap的实现_Java_Hashmap - Fatal编程技术网

关于Java HashMap的实现

关于Java HashMap的实现,java,hashmap,Java,Hashmap,为什么容量必须是倍数或2? 为什么在indexFor函数中使用“&”? 为什么要在哈希函数中重新计算哈希,而不是直接使用密钥的哈希代码 我认为这个实现和“算法简介”的描述之间有一些重要的区别 “>>>”是什么意思 谁能给我一些指导吗?如果有人能解释一下散列算法,我将不胜感激。 非常感谢 这是一个性能优化。将哈希代码映射到表索引的常用方法是 table_index = hash_code % table_length; %操作符很昂贵。如果table_length是2的幂,则计算: table_

为什么容量必须是倍数或2? 为什么在indexFor函数中使用“&”? 为什么要在哈希函数中重新计算哈希,而不是直接使用密钥的哈希代码

我认为这个实现和“算法简介”的描述之间有一些重要的区别

“>>>”是什么意思

谁能给我一些指导吗?如果有人能解释一下散列算法,我将不胜感激。
非常感谢

这是一个性能优化。将哈希代码映射到表索引的常用方法是

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.