HashMap可以设置初始化容量大小吗?如果设置为20是多少?
HashMap设置初始化容量20的具体流程:
答:是可以设置初始容量大小,设置为20,容量为32,2的n次方。
找一个 大于 最接近 我们设置初始容量的2的N次方作为初始容量。(重点)
1、设置初始化容量为20

2.看源码
1.传参,调用有参构造方法

这个是源码英文解释 :



2.initialCapacity为20,loadFactor为0.75f

结果为默认的负载因子(loadFactor)0.75,HashMap所能容纳最大key-value键值对个数(threshold)
3.调用tableSizeFor方法,cap为20

运算:
int n = cap -1 = 20 - 1 = 19;
n |= n >>> 1 = n | n >>>1 = 19 | 19 >>> 1 ;
19的二进制为 1 0011,19 >>> 1 为1 0011右移一位,为1001(9)
| 运算规则(一个为真即为真)1|0 = 1 , 1|1 = 1 , 0|0 = 0 , 0|1 = 1


n 不小于0,走 n >= MAXIMUM_CAPACITY

1 << 30 为 2乘1073741824 很大的一个数字;但是 n 是小于这个数字的,走n+1 也就是31+1 =32。
当程序执行完毕,HashMap初始化的容量就为32。
总结:
1、initialCapacity(初始容量)=键值对数量 / 0.75
(1)map中的默认初始容量是16,16×0.75=12也就是说在键值对小于12时,不会进行扩容,大于等于12时会进行扩容;另外map的初始容量并不是根据我们传进去的值来作为初始容量,它会经过计算,把第一个大于等于传入值的2的幂作为初始容量。
例如:传一个7,那初始容量就是2的3次方8,传一个9,初始容量就是2的四次方16。
(2)为什么要设置初始容量:设置初始容量是为了提高性能,因为当"键值对数量" > 0.75 × initialCapacity会进行扩容,每次扩容都要重建hash表,是非常影响性能;初始容量设置过大,又会浪费内存,所以非常有必要设置一个合适的初始容量。
(3)初始容量设置公式:键值对数量/0.75+1
为什么要加1呢?假如现在需要在map中放入6个键值对,按照公式计算6 / 0.75等于8,那初始容量是不是就得设置成8。肯定不是,如果设置成8,当map中键值对数量达到6个时候,就会进行扩容,所以应当设置成8+1=9才合适。
2、当我们使用HashMap集合没有指定初始容量时默认是16,如果给定了一个初始容量,tableSizeFor(int cap)方法会返回一个等于2的n次方的数来作为集合的初始容量。如果用户给定的初始容量就等于2的n次方,那么返回的这个数就等于用户给定值,否则将会返回一个大于且最接近用户给定值的2的n次方的数来作为HashMap集合的初始容量。
参考链接:(14条消息) HashMap-1.8 之初始化容量与参数设置(源码分析)_唯荒的博客-CSDN博客_hashmap设置参数
Java &、&&、|、||、^、<<、>>、~、>>>等运算符 - 腾讯云开发者社区-腾讯云 (tencent.com)
(14条消息) java中 1<<30 什么意思 (转载)_墨笔夺魂的博客-CSDN博客_1 << java
总结:此文是作者原创;有任何不足,请指出修正,大家相互学习, 谢谢!

浙公网安备 33010602011771号