HashMap默认初始容量是16,长度始终保持2的n次方,加载因子为0.75,扩容增量:原容量的1倍。
如果我们直接设置初始大小为实际存储的数量的话,HashMap并不会使用我们传进来的 initialCapacity 直接作为初识容量。JDK 会默认帮我们计算一个相对合理的值当做初始容量。所谓合理值,其实是找到第一个比用户传入的值大的 2 的幂。比如传7的话,JDK 会通过计算,帮我们创建一个容量为 8 的 Map,传9的话,JDK 会通过计算,帮我们创建一个容量为16的 Map。
实际存储的数量 >initialCapacity *0.75时 会进行扩容,每次扩容都需要重建hash表,是非常影响性能的。同样设置过大浪费内存,因此设置一个合适的初始容量是有必要的。
可通过expectedSize /0.75F + 1.0F 计算默认初始的大小,expectedSize 为要存的数量。