北京网站模板,百度收录的网站标题 --,郑州网约车资格证,品牌设计公司简介HashMap之节点删除大家一直关注的都是HashMap如何添加节点#xff0c;当节点数量大于8的时候转化为红黑树#xff0c;否则使用链表等等#xff0c;但大家是否有看过删除节点的处理逻辑呢#xff1f; 今天来看看HashMap删除节点的神来之笔问题来源在查看HashMap源码时#…HashMap之节点删除大家一直关注的都是HashMap如何添加节点当节点数量大于8的时候转化为红黑树否则使用链表等等但大家是否有看过删除节点的处理逻辑呢 今天来看看HashMap删除节点的神来之笔问题来源在查看HashMap源码时有个以下字段在删除的时候判断节点数量最多在小于6的时候会untreeifying(树转化为链表)在点击这个字段时发现只有在split()方法中使用但split()方法在resize()方法中使用与删除节点无关遂去翻删除节点的代码逻辑节点删除通过remove方法一路进来找到删除节点的地方。如下图我们进入removeTreeNode方法中代码如下查看方法注释里面介绍到如果节点太少就会把当前bin转换成普通bin。不理解注释没关系我们进入这个方法中唯一有转化的地方。进入untreeify()方法查看下。代码如下噢第一行看一下if,else看一下嗯这个方法就是获取返回了一个列表(这些方法都是TreeNode类里面的方法所以请注意this就是当前要操作的TreeNode节点)。到此明白这个方法就是把红黑树转化成链表的那么我的就得分析分析是如何操作的了而没有使用到定义的全局变量。删除判断逻辑分析我们来分析分析上面这个逻辑进入这个untreeify() 的要求是root null, root.right null, root.leftnull, root.left.leftnull四种情况我们以7个节点的红黑树来分析A为root节点。所以进入这个方法主要有以下几种情况我们一种一种的来分析当满足要求时节点的个数。(这里默认认为知道红黑树的5个特点主要是黑平衡)当这四种情况都满足时我们可以看出最多节点有如上图所示个数可以为7个。(大于8个不考虑因为大于8会变成红黑树)。1. 最多节点情况当我们删除节点D时只满足root.left.leftnull这个条件这棵树仍可以维持红黑树的特点这时的最大节点数为6.2. 最少节点情况当EFG不存在时在A,B,C,D中删除任意一个节点都会满足上述四种规则中的一种。则存在最少节点情况有3个节点。以上情况都是会将树转化成链表此时的节点是 3 nodes 6 由此可以看出当节点数在小于6时是可能转化成链表但不是绝对情况 所以使用定义的变量(固定数量6)也不正确。只好通过判断去动态获取节点数。节点数量原因分析为什么在小于6的时候可能转换成链表而在大于8的时候转化成红黑树主要通过时间查询节点分析红黑树的平均查询时间为 log(n), 而链表是O(n)平均是O(n)/2。当节点数为8时红黑树查询时间3链表查询时间是4, 可以看出来当红黑树查询效率大于了链表。(两个函数曲线问题当节点更多是比红黑树需要的时间更多)当节点数为6时为什么转换成链表我认为主要时因为节点数太少如果还是用红黑树为了维持红黑树的特点则需要翻转左旋右旋等更消耗性能。 为什么不是7是转化主要是为了给一个过渡防止频繁转化。 也如上图7个节点可能正好是一个满二叉树。来自https://www.cnblogs.com/lifacheng/p/11032482.html