HashMap 红黑树中 moveRootToFront 源码分析
//进行双向链表的调整 ,经过左旋,或者右旋操作后,双向链表的头节点可能发生了变化。需要把根节点放到链表头节点
static <K,V> void moveRootToFront(Node<K,V>[] tab, TreeNode<K,V> root) {
int n;
if (root != null && tab != null && (n = tab.length) > 0) {
//拿到tab的数组下标
int index = (n - 1) & root.hash;
//保存原始的双向链表
TreeNode<K,V> first = (TreeNode<K,V>)tab[index];
// 头节点是否发生了改变
if (root != first) {
Node<K,V> rn; //root的下一个元素,为了后续的双向链表的指向做工作
tab[index] = root; //将树结构覆盖原来的值
TreeNode<K,V> rp = root.prev; // root的前继 为了root断开链表进行操作
if ((rn = root.next) != null) //如果root后继不为空,说明root 节点处于中间 需要对root进行断开链表操作
((TreeNode<K,V>)rn).prev = rp; //将root的后继指向root的前继
if (rp != null) //rp!=null 说明root有前继
rp.next = rn; //root前继的后继指向root的后继 这样root就移除了双链表。相当于从链表中删除了root节点
if (first != null) //原来的双向链表不为空 进行头插法插入root
first.prev = root;
root.next = first;
root.prev = null; //前继置为空 完成头插法插入,root成为链表头节点
}
assert checkInvariants(root);
}
}