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 @   学霸的芯  阅读(362)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示

目录导航