欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-19 16:07:49
...

==来源:==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相同的几率较小,那么数据在数组上分布就比较均匀,也就是说碰撞的几率小,相对的,查询的时候就不用遍历某个位置上的链表,这样查询效率也就较高了。

三:

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