自学内容网 自学内容网

为什么 HashMap 的容量是 2 的整次幂?

首先我们要知道元素定位原理

HashMap 在定位元素位置时,先通过 hash(key) = (h = key.hashCode()) ^ (h >>> 16) 计算出哈希值,再通过 hash & (n-1) 来定位元素位置的,n 为数组的大小,也就是 HashMap 的容量。

原因一:更快的数组下标定位

数组下标的计算原是要通过取模得到的。在容量是 2 的整次幂时,hash & (n - 1) = hash % n,取模可以被位运算代替,提升定位速度。

原因二:使元素分布更加均匀

在容量是 2 的整次幂时, (n - 1) 是奇数,对应的二进制最后一位是 1,从而 hash & (n - 1) 的最后一位可能为 0,也可能为 1(取决于 hash 的值),即 & 运算后的结果可能为偶数,也可能为奇数,可以使元素分布更加均匀

【补充】

在 JDK 8 的新 hash 算法下,数组扩容后的索引位置遵循一定的规律。
在进行数组扩容后元素重新定位时,只需要判断元素哈希值的高位中新增的那一位有效位是否为 1 即可。如果是 1,移动该元素到原位置加旧容量的位置;如果是 0,则保持在原位置


原文地址:https://blog.csdn.net/weixin_45606831/article/details/140528657

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!