HashMap源码(二) —— 成员变量 DEFAULT_INITIAL_CAPACITY 为什么是2的n次方???

HashMap的初始化容量必须是2的n次幂以确保数据分布均匀,避免hash碰撞导致效率降低。非2n次幂的值会通过特定算法调整为最接近的2n次幂,以保证索引计算的均匀性。
摘要由CSDN通过智能技术生成

HashMap 初始化容量

// 默认容量 16
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;  //16

为什么必须是2的n次幂

 因为只有是2n,才可以通过 hash & (leng-1) 计算出的索引尽可能保证数据分布均匀.
 如果不是2的n次幂,计算出的索引特别容易相同,很容易发生hash碰撞,导致其余数组空间很大程度上没有存储数据,链表或者红黑树过长,效率较低.

 说明:为什么是2的n次方?

2n的二进制是一个首位是1 后面为是0的数,如 23 二进制为00001000 23-1 二进制为00000111
hash & (2n-1) 表示 hash值对应的二进制与n个1 做与运算 都为1 则为1 否则为0
只有当 一个数的二进制有效位全是1的情况下 ,不同hash值计算的结果差异性才会更多。
如: 以下结果很明显全为1的情况计算的差异性会更大
  1111111     100000
&001001    &001001
———————————————
  001001    000000

如果在实例化的时候传入的值不是2n会怎样?

当实例化HashMap实例时,如果给定number不是2n initialCapacity(number),由于HashMap的capacity必须是2的次幂,会通过以下方法 (tableSizeFor ) 计算找到大于等于number最小的2n的数。

计算容量分析
HashMap map = new HashMap<>(10)
//获取大于等于传入容量的最小二次幂值 
static final
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值