为什么HashMap的initailCapacity要设置成2的n次幂?

==来源:==https://blog.csdn.net/liuchang840302/article/details/83751683
说明:
1.如果不超过12个键值对,可以不设置
2.如果超出,按initialCapacity = (需要存储的元素个数 / 负载因子) + 1公式计算后设置
3.官方的建议是initailCapacity设置成2的n次幂

正例:initialCapacity = (需要存储的元素个数 / 负载因子) + 1。注意负载因子(即loader factor)默认为0.75, 如果暂时无法确定初始值大小,请设置为16(即默认值)。

反例:HashMap需要放置1024个元素,由于没有设置容量初始大小,随着元素不断增加,容量7次被迫扩大,resize需要重建hash表,严重影响性能。

来源: https://www.cnblogs.com/gaoquanquan/p/10870827.html
一:

源代码是这样实现的:

static final int hash(Object var0) {
    int var1;
    return var0 == null ? 0 : (var1 = var0.hashCode()) ^ var1 >>> 16;
}

原来的经过一次扰动函数之后的值数组长度,得到所在数组下标值,相比直接数组长度,碰撞次数少了很多

二:

https://www.cnblogs.com/yesiamhere/p/6653135.html

当数组长度为2的n次幂的时候,不同的key算得得index相同的几率较小,那么数据在数组上分布就比较均匀,也就是说碰撞的几率小,相对的,查询的时候就不用遍历某个位置上的链表,这样查询效率也就较高了。

三:

链表查询是线性的,会影响存取性能

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值