2021/07/02 HashMap 扩容机制

默认初始化

当HashMap 未初始化容量时,第一次put()添加元素,table数组为null,触发扩容机制,resize()会初始化table数组,默认值为16,阈值threshold为12(16容量capacity*0.75负载因子loadfactor),直到size>threshold时再次进行扩容,采用左移1位运算,将容量扩充为原来的两倍,阈值也是;如此反复。

指定初始化

当实例化HashMap时,指定参数时,若传参不是2的幂次时,构造函数会自动将该值转为大于次数最近的2次幂(如100->128、129->256等),当添加元素个数大于阈值时,触发扩容机制,将容量和阈值扩充为原来的两倍。

扩容触发条件

1>table数组为空或table.size()为零时,采用默认初始化(capacity = 16、threshold=12)
2>size>threshold时,进行扩容为原来的两倍

重新散列

当扩容为原来的两倍时重新散列元素转移的四种情况
1>为空时,则不赋值(数组默认为null)
2>只有一个元素,直接将元素哈希值计算桶位赋值到新数组
3>红黑树时,将对树进行切分(未详细探究详细源码)。
4>链表时,用原来的hash数,与oldCap进行&运算(hash&oldCap)意思是假如原来的容量是十六,二进制码为00010000将判断元素哈希值的第五位是否为1若为1,存到新扩展的十六位,否则,存到旧十六位的位置。直到元素的下一个指针为null时停止。哈希值第五个比特为1的链表存到当前下标加oldCap的数组位置;第五比特为零的存到新数组与老数组相同下标下。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值