为什么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相同的几率较小,那么数据在数组上分布就比较均匀,也就是说碰撞的几率小,相对的,查询的时候就不用遍历某个位置上的链表,这样查询效率也就较高了。
三:
链表查询是线性的,会影响存取性能
上一篇: java 内存泄露的例子