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 //高位全部归零,只保留末四位
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!