在已知HashMap中将要存放的KV个数的时候,设置一个合理的初始化容量可以有效的提高性能。
HashMap默认初始容量:16 (即2<<3)
别问为什么,太大浪费内存,太小频繁扩容,16是一个在性能和资源之间相对折中的选择;
我们可以在new HashMap时显式指定容量大小
HashMap<String, Object> map = new HashMap<>(expectedSize );
但是!!
但是!!
但是!!
事情没你想得那么简单
你指定容量大小后,实际初始容量大小并不一定是你指定的容量大小,因为HashMap的发明者认为实际需要的容量大小往往大于你在new HashMap时预估的大小expectedSize ,所以HashMap底层会对你指定的expectedSize 进行处理,处理后的expectedSize 才是实际容量大小;
底层容量处理
Hash会选择第一个大于等于你传入expectedSize 的第一个2的幂作为容量
比如
new HashMap<>(3),那么实际初始容量大小为4;
new HashMap<>(4),那么实际初始容量大小为4;
new HashMap<>(5),那么实际初始容量大小为8;
new HashMap<>(7),那么实际初始容量大小为8;
new HashMap<>(10),那么实际初始容量大小为16;
new HashMap<>(16),那么实际初始容量大小为16;
new HashMap<>(23),那么实际初始容量大小为32;
…
这里多举一些例,方便大家理解