HashMap的底层原理分析二

来源:互联网 发布:矩阵优化 编辑:程序博客网 时间:2024/06/10 00:32

上一篇文章把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的幂的话在减去一在经过与运算就会使索引均匀分布.



原创粉丝点击