通过将 Key 的 hash 值与 length-1 进行 & 运算,实现了当前 Key 的定位,2 的幂次方可以减少冲突(碰撞)的次数,提高 HashMap 查询效率; 如果length 为 2 的次幂 则 length-1 转化为二进制必定是 11111……的形式,在于 h 的二进制与操作效率会非常的快,而且空间不浪费; 如果length 不是 2 的次幂,比如 ...
HashMap 的容量(长度)之所以选择为2的n次幂(如16、32、64等),主要是基于以下几点考虑: 位运算加速:当 HashMap 的容量是2的幂时,可以利用位运算(特别是右移运算>>和按位与运算&)来替代模运算(%),提高计算效率。具体来说,对于任何整数hash,hash & (length - 1)的效果等同于hash % length,但位运算比模运...
综上所述,HashMap的长度选择为2的幂次方是为了利用位运算快速计算索引、简化扩容过程和减少哈希冲突,从而提高HashMap的性能和效率。
但是,重点来了:“取余(%)操作中如果除数是 2 的幂次则等价于与其除数减一的与(&)操作(也就是说hash%length==hash&(length-1)的前提是 length 是 2 的 n 次方;)。” 并且 采用二进制位操作 &,相对于%能够提高运算效率,这就解释了 HashMap 的长度为什么是 2 的幂次方。为什么取余(%)操作中如果...
1. HashMap 的长度为什么需要是2的幂次方 为了能让hashMap存取高效,尽量减少碰撞,也就是要尽量把数据分配均匀。 Hash值的取值范围-2147483648到2147483647,总共有40+亿个映射空间,只要哈希函数映射的比较均匀,一般应用很难出现碰撞,但是内存肯定不能一次加载这么长的数组,所以这个散列值是不能拿来直接用的,我们只能创...
HashMap 的长度设计为 2 的幂次方的原因主要有以下几个: 高效索引计算: 在HashMap 中,当插入一个键值对时,需要根据 key 的哈希码计算出该元素在数组中的存储位置。计算方式是使用(n - 1) & hash来获取对应的数组下标,其中n是数组的长度,hash是经过哈希函数计算后的结果。如果数组长度n是 2 的幂次方,那么...
HashMap选2的幂次方?原因在这! HashMap是Java中常用的数据结构,它通过数组+链表/红黑树的方式存储键值对。HashMap的数组长度通常默认为2的幂次方,如16。为什么选择这样的长度呢? 首先,HashMap希望键值对能够均匀地分布在数组的每个索引上。如果我们定义了一个长度为16的HashMap,可以通过取余操作来判断键值对应该放...
在HashMap的有参构造中,就规定了创建出的数组长度都必须是2的幂次方 而其原因在于:首先,在存储寻找数组位置时,本来应该用hashcode%数组长度但是为了增加运算效率,...
反观,长度16或其他2的幂次方,Length - 1的值的二进制所有的位均为1,这种情况下,Index的结果等于hashCode的最后几位。只要输入的hashCode本身符合均匀分布,Hash算法的结果就是均匀的。 一句话,HashMap的长度为2的幂次方的原因是为了减少Hash碰撞,尽量使Hash算法的结果均匀分布。
注释就说的很清楚了,默认的初始容量 - 必须是2的幂。也就是说,HashMap的长度自己定义的时候,只要是2的次幂就行。那么为什么要是2的次幂?3的次幂行不行?我们接着往下看。来看HashMap的put方法: 可以看到put方法调用了putVal方法,再来看putVal方法,以下为putVal方法的部分源码: ...