HashMap底层数组的长度为什么是2的幂次方?

HashMap的底层是由数组加链表及红黑树实现的,其中链表是为了解决哈希冲突而引入的,并且在JDK1.8之后,引入了红黑树结构,在链表长度大于一定的阈值之后,采用红黑树的结构代替链表结构,加快搜索速度,其结构如下图所示。
在这里插入图片描述
并且我们知道,HashMap是可以指定初始容量的,不指定的话默认初始容量是16,如果传入一个值用来指定初始容量,并不是直接使用这个值来定义数组长度,而是用大于等于这个值的最小2的幂次方来作为初始容量,之所以要采用2的幂次方来作为HashMap底层数组的长度,是因为在对数据的key值进行哈希函数运算得到的哈希值范围很大,无法直接作为数据存放位置的数组下标,因此需要对得到的哈希值作进一步处理,一般来说是对数组长度进行取模运算,在数组长度为2的幂次方的时候,用哈希值与数组长度-1的值做逻辑与运算就相当于对数组长度取余,逻辑与运算因为运算符优先级的关系会比直接的取余运算效率更高,这就是HashMap底层数组长度一般为2的幂次方的原因。
多提一句,在HashMap的源码中,采用的是tablesSizeFor函数来获取大于等于指定初始容量值的最小2的幂次方的,源码如下:
在这里插入图片描述
本质上就是通过移位来获取的,感兴趣的可以花时间了解一下具体过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值