上一篇文章把HashMap的一Put和Get做了一个简单的介绍了一下,这篇主要说一下关于HashMap的扩容以及以及原因.
HashMap的初始长度为16,没次扩容的时后,扩大的长度必须是2的幂.这里没有提到负载因子是因为我了解到负载因子可能引起HasnMap的死循环准备单独分析一下,在这里先说一下负载因子的默认大小为0.75,它是用来决定HasHMap的容量的临界值的.具体的东西在总结一下在写.
这里我查了一些质料,关于HashMap的长度为什么是16以及,为甚是2的幂
下面说的只要你学过数电绝对能看懂,不过我现在这里回忆简单的回忆一下数电的与、或运算
与运算 0与任何数都为0(0 & 0 为 0,0 & 1为0)
或运算 1或上任何数都为1(1 | 0 为 1 .1 | 1为 1)
在HasHMap中就用到了运算,在上一篇提到了一个确定Entry的索引,要用到Hash函数这个Hash函数为
index = HashCode(Key) & (length-1)
到这里差不多就把HashMap的默认长度的问题解决了.15的转化为二进制为1111
假设一个HashCode的值为0000 1110 0001 1101 1001 与15作与远算的话
0000 1110 0001 1101 1001
& 1111
结果为1001索引为7.但是如果长度为其他的长度.比如说是7 二进制1001
那么0000 1110 0001 1101 1001 以及0000 1110 0001 1101 1011 、0000 1110 0001 1101 1111的结果是相同的也就是索引的重复率会提高很多.如果使用16的话会使索引的分布均匀.
为什么2的幂,个问题就更简单了,因为如果是2的幂的话在减去一在经过与运算就会使索引均匀分布.