利用resize()方法进行扩容,整个扩容过程是需要把旧表每个键进行重哈希然后写入扩容后的新表中。java hashmap默认初始容量是16,每次扩容是将容量扩大为两倍。而且hashmap容量要时刻保持2的幂次方,因为我们计算出hashcode之后,还要对length取余,从而得到hashmap index的位置。但是我们用另外一种位运算的方式得到这个位置,速度更快,只是要求length必须为2的幂次方,因此 hashmap的容量就一直保持为2的幂次方。

HashMap 容量为2次幂的原因,就是为了数据的的均匀分布,减少hash冲突,毕竟hash冲突越大,代表数组中一个链的长度越大,这样的话会降低hashmap的性能。
那么是如何保证均匀分布能?因为我们每次将key放的为你之是i=(n-1)& hash,其中 n 代表数组的长度,即map的容量。当n为2的幂次方时,(n-1)& hash 的值是均匀分布的。