HashMap形成环的原因

1.前言

关于1.7版本hashMap形成环的原因网上有很多说明,无非就是a指向b,二次循环b指向a,形成环了。但是形成过程真的是众说纷纭,眼花缭乱,各有各的说法(wtf!!!)在此,我将按照源码的方式将形成环的过程好好梳理一番。

2.形成环的过程

2.1 环嘛,当然是在resize的时候形成的,否则你一直插插插(put)最多也就是数据出错的问题,在此不解释

2.2 先看resize方法,如下图

没什么好说的,创建了一个2倍大小的newTable,然后在transfar里对它进行修改,把原来的table指向这个新的table

2.3 实际进行resize操作的transfar方法,如下图:

看起来是不是很简单,两个循环而已,但是里面有大大的坑,接下来我会举例说明:

假设有如下一个HasMap,就两个下标0和1,table[0]为null,table[1]存key=3的entry对象,因为entry对象有next标记,所以可以通过next标记找到下一个key=

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
引用\[3\]提到,HashMap在1.7版本中没有使用红黑树,而是使用了链表来存储元素。由于使用尾插法,每次都要遍历链表去获取尾节点,这样会耗费性能。而在1.8版本中,HashMap采用了红黑树结构,并且转换条件是链表长度大于8时才会转换成红黑树。这样,遍历链表的次数最大就是8,当超过8时就会转换成红黑树。遍历红黑树的次数取决于树的深度,所以遍历的性能消耗可以忽略不计。这样就解决了头插法循引用的问题。\[3\] 所以,在HashMap 1.7版本中,由于没有使用红黑树,可能会存在的问题。但在1.8版本中,通过使用红黑树结构,并设置了转换阈值为8,可以有效地解决的问题。 #### 引用[.reference_title] - *1* [HashMap1.7 扩容产生形链表](https://blog.csdn.net/weixin_42496727/article/details/124118191)[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^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [HashMap的原理,1.7为什么会形成](https://blog.csdn.net/weixin_41796956/article/details/120562231)[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^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值