HashMap 哈希取值为啥要用&运算

为什么HashMap的数组长度要取2的整数幂以及求key的索引位置为什么可以用&运算来代替%运算

根据hash数取数组下标

i = hash & (n - 1);

为什么可以用 & 运算符来模拟 % 操作?

HashMap 的容量必须是 2 的次幂,所以其容量 n 转换成二进制中必然只有一位是 1,

那么 n - 1,就是将最左边的那一位 1 变为 0,并且将其右边的 0 变成 1 ,

再将得到的值和 hash 通过 & 按位相与,这样的话得到的结果必然不会大于 n-1,
即通过位运算达到了 % 操作的目的,还减小了 CPU 资源的消耗(位操作速度一般的操作符快多了)

为什么HashMap的数组长度要取2的整数幂

这也正好解释了为什么HashMap的数组长度要取2的整数幂。因为这样(数组长度-1)正好相当于一个“低位掩码”。“与”操作的结果就是散列值的高位全部归零,只保留低位值,用来做数组下标访问。以初始长度16为例,16-1=15。2进制表示是00000000 00000000 00001111。和某散列值做“与”操作如下,结果就是截取了最低的四位值。

     10100101 11000100 00100101
 &   00000000 00000000 00001111
----------------------------------
     00000000 00000000 00000101    //高位全部归零,只保留末四位

posted @ 2022-02-17 15:07  学霸的芯  阅读(333)  评论(0编辑  收藏  举报