HashMap之moveRootToFront
前提:
- jdk1.8之前HashMap的存储方式:链表+hash
- jdk1.8以后中HashMap的存储方式:链表+hash+红黑树算法
作用
- 确定红黑树的根节点是HashMap的table数组中的值
业务逻辑整理
- 1,红黑树根节点不能为空,table数组不能为空
- 2,获取红黑树根节点的应该放入的下标位置
- 3,如果当前的下标位置放得对象与需要验证的对象,不是同一个对象
- 3.1,设置红黑树根节点的值为改下标位置的值
- 3.2,重置红黑树根节点的上下级关系,主要是调整root,root.prev,root.next,first;四者的关系
以下是详细注释
/**
* Ensures that the given root is the first node of its bin.
* 确保给定的根是其容器的第一个节点。
*/
static <K,V> void moveRootToFront(Node<K,V>[] tab, TreeNode<K,V> root) {
int n;
//1,红黑树根节点不能为空,table数组不能为空
if (root != null && tab != null && (n = tab.length) > 0) {
//2,获取红黑树根节点的应该放入的下标位置
int index = (n - 1) & root.hash;
TreeNode<K,V> first = (TreeNode<K,V>)tab[index];
//3,如果当前的下标位置放得对象与需要验证的对象,不是同一个对象
if (root != first) {
Node<K,V> rn;
//3.1,设置红黑树根节点的值为改下标位置的值
tab[index] = root;
TreeNode<K,V> rp = root.prev;
//3.2,重置红黑树根节点的上下级关系,主要是调整root,root.prev,root.next,first;四者的关系
if ((rn = root.next) != null)
((TreeNode<K,V>)rn).prev = rp;
if (rp != null)
rp.next = rn;
if (first != null)
first.prev = root;
root.next = first;
root.prev = null;
}
assert checkInvariants(root);
}
}