HashMap的底层原理分析二

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



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值