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
    评论
HashMap扩容机制是指当HashMap中的元素个数超过数组长度乘以负载因子时,就会重新分配一个更大的数组,并将原来的元素重新计算哈希值并插入到新的数组中。不同版本的Java实现了不同的扩容机制。在JDK1.7版本中,HashMap的默认容器长度为16,扩容因子为0.75,以2的n次方扩容,最高可扩容30次。第一次扩容是在长度达到16*0.75=12的时候开始扩容扩容后的长度为16*2^1=32。 在JDK1.8中,HashMap扩容机制有以下改进: - HashMap在第一次调用put方法时才会初始化数组,而不是在创建对象时就初始化。 - HashMap在初始化或扩容时,会根据指定或默认的容量找到不小于该容量的2的幂次方,并将其赋值给阈值。 - 然后在第一次调用put方法时,会将阈值赋值给数组长度,并让新的阈值等于数组长度乘以负载因子。 - 在扩容过程中,HashMap不需要重新计算节点的哈希值,而是根据哈希值最高位判断节点在新数组中的位置,要么在原位置,要么在原长度加上原位置处。 - 在扩容过程中,HashMap会正序遍历原来的数组,并保持链表中节点的相对顺序不变。 - 如果某个链表中的节点数超过8个,并且数组长度大于等于64,则会将链表转化为红黑树,提高查找效率。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [hashmap 扩容机制](https://blog.csdn.net/a772304419/article/details/130835555)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [HashMap扩容机制](https://blog.csdn.net/eg1107/article/details/128228687)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值