Java基础——HashMap扩容2倍

HashMap扩容2倍

在HashMap中,执行put方法时,会对添加的key进行运算得出对应的hash值,再根据hash值计算得出对应的hash桶坐标节点tab[i]。

if ((p = tab[i = (n - 1) & hash]) == null)
  tab[i] = newNode(hash, key, value, null);

其中i = (n-1) & hash,n为tab数组长度,默认初始值为16。

扩容倍数为2,则tab长度一定为偶数,所以n-1位奇数,奇数的二进制形式最后一位一定是1,那么与hash进行与运算时得到的可能为奇数也可能为偶数,散列较为均匀。

如果扩容倍数不为2,可能会出现tab长度为奇数的情况,当tab长度为奇数时,n-1一定为偶数,奇数的二进制形式最后一位一定是0,那么与hash进行与运算时得到的一定是偶数,会有一半的hash桶没有得到利用。

举例:tab长度为25,扩容2倍后为50,50的二进制:110010, n-1=110010-1=110001

110001 & hash(111100) = 110000(十进制为48,偶数)散列后为偶数

110001 & hash(100101) = 100001(十进制为33,奇数)散列后为奇数

结果的奇偶由hash值来决定。

                      tab长度为25,扩容2倍+1后为51,二进制:110011,n-1=110011-1=110010

110010 & hash(111100) = 110000(十进制为48,偶数)散列后为偶数

110010 & hash(100101) =100000(十进制为32,偶数)散列后为偶数

结果一定是偶数,与hash无关,则i为奇数的hash桶无法被利用到。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值