HashMap的初始容量为什么一定是2的n次方!!!

大家都知道HashMap的初始容量是16,负载因子是0.75,当它的容量达到16*0.75=12时,便开始进行扩容。但是你知道为什么HashMap的初始容量是16吗?为什么不能是17?为什么不能是19?
这个原因显然只有通过看源码,我们才能了解其中的真谛!

HashMap的初始容量为什么一定是2的n次方!!!
HashMap的源码写道 MUST be a power of two. 就是必须是2的幂次方的意思!并且规定它的初始容量对1按位运算,从1开始左移4位,也就是16啦!并且是一个静态常量,不允许修改!

HashMap的初始容量为什么一定是2的n次方!!!
需要注意的是,我们创建了一个HashMap时,并没有立即给分配16个容量,那什么时候分配呢?对的,当进行put操作时,才会给分配。否则,如果一创建HashMap就给分配16个容量,可能会造成空间的浪费,降低内存的效率!因为你不知道你创建的HashMap有没有被用起来。

HashMap的初始容量为什么一定是2的n次方!!!
可以看到我们每次往里面put的时候,当哈希表为空时,它都会调用inflateTable()这个函数,而恰好这个函数内部调用了roundUpToPowerOf2(),也就是向上取整函数!

HashMap的初始容量为什么一定是2的n次方!!!
所以,通过源码,我们很快就可以明白,当我们给的初始容量如果超过它的默认值16,HashMap内部会处理好这种情况,并且会保证永远是2的n次方!!!