HashMap中红黑树退化成链表的条件(源码分析)

条件
  1. 扩容 resize( ) 时,红黑树拆分成的 树的结点数小于等于临界值6个,则退化成链表。
  2. 移除元素 remove( ) 时,在removeTreeNode( ) 方法会检查红黑树是否满足退化条件,与结点数无关。如果红黑树根 root 为空,或者 root 的左子树/右子树为空,root.left.left 根的左子树的左子树为空,都会发生红黑树退化成链表。


扩容 resize( ) 的源码分析
  1. 扩容时如果是红黑树结构会执行红黑树的 split( ) 方法
  2. split 方法中会初始化生成 loHead 和 hiHead 两个红黑树的头结点(之后会用 low 和 high 表示)
  3. lc 和 hc 分别为 low 和 high 的元素个数,初始化为0
  4. 把红黑树中的结点依次添加到 low 和 high 两颗红黑树中,依靠 (e.hash & bit) == 0 的位运算来判断属于哪颗树,bit是传过来的旧数组下标。每颗树元素的增加都会使对应的 lc 或 hc 自增1。
  5. 生成完 low 和 high 两颗红黑树后,如果对应的元素个数 lc,hc 小于等于6,退化成链表,否则维持红黑树形态。
  6. low树插入到新数组 tab[index] 的位置上,index是当前红黑树所在旧数组坐标;high树插入到新数组 tab[index + bit] 的位置上,bit是旧数组长度。
//退化链表的临界值
static final int UNTREEIFY_THRESHOLD = 6;

//1、扩容时如果是红黑树结构会执行split方法
else if (e instanceof TreeNode)
	((TreeNode<K,V>)e).split(this, newTab, j, oldCap);
	
final void split(HashMap<K,V
HashMap中的红黑树树化退化是指当链表中的节点数量较多时,HashMap会将链表转化为红黑树来提高查找效率。红黑树是一种自平衡的二叉查找树,可以在O(logN)的时间复杂度内进行查找、插入和删除操作。 在HashMap中,当某个哈希桶中的链表节点数量超过一个阈值(TREEIFY_THRESHOLD)时,就会触发将链表转化为红黑树的操作。这个阈值的默认值是8。具体的判断条件是binCount >= TREEIFY_THRESHOLD - 1。 转化为红黑树后,原本的链表结构就会被改变成一个更高效的树结构,这样就可以在更快的时间内执行查找、插入和删除操作。当然,如果在某些操作之后,哈希桶中的节点数量减少到一个较小的值(UNTREEIFY_THRESHOLD),则会将红黑树恢复为链表,以节省空间。 总之,在HashMap中,红黑树树化退化是为了提高链表操作的效率而引入的优化机制,它可以在特定的条件下将链表转化为红黑树,并且在节点数量变少时将红黑树恢复为链表。这样可以更好地平衡查找速度和空间的利用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [HashMap红黑树原理详解及源码分析](https://blog.csdn.net/qq_43207114/article/details/128617285)[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_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值