Java中的HashMap实现。 水桶指数计算如何工作?
我正在看Java中的HashMap
的实现,并坚持一点。
如何计算indexFor
函数?
static int indexFor(int h, int length) { return h & (length-1); }
谢谢
这不是计算散列 ,而是计算桶 。
expression式h & (length-1)
在h
使用length-1
AND
来执行,这就像一个位掩码,只返回h
的低位位,从而形成一个超快的变体h % length
。
散列本身是通过您尝试存储的对象的hashCode()
方法计算的。
你在这里看到的是计算基于哈希h
存储对象的“桶”。 理想情况下,为了避免碰撞,你可以得到与h
的最大可达值相同的桶数 – 但这可能太过内存要求。 因此,你通常有一个桶的数量较less,有碰撞的危险。
如果h
是1000,但在底层数组中只有512个存储桶,则需要知道将对象放在哪里。 通常情况下,对h
的mod
操作就足够了,但这太慢了。 考虑到HashMap
的内部属性,底层数组总是具有等于2^n
的桶2^n
,Sun的工程师可以使用h & (length-1)
,它将按位进行AND运算, s,实际上只读取散列的n
最低位(这与h mod 2^n
,只是更快)。
例:
hash h: 11 1110 1000 -- (1000 in decimal) length l: 10 0000 0000 -- ( 512 in decimal) (l-1): 01 1111 1111 -- ( 511 in decimal - it will always be all ONEs) h AND (l-1): 01 1110 1000 -- ( 488 in decimal which is a result of 1000 mod 512)
它正在计算存储条目(键值对)的哈希映射的桶。 bucket id是hashvalue/buckets length
。
哈希映射由桶组成; 对象将被放置在基于桶标识的这些桶中。
任何数量的对象实际上都可以基于它们的hash code / buckets length
值落入同一个桶中。 这被称为“碰撞”。
如果许多对象落入同一个桶中,searchequals()方法将被调用以消除歧义。
碰撞的次数与桶的长度间接成正比。