HashMap之moveRootToFront

20 篇文章 0 订阅

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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值