concurrentHashmap红黑树的添加

 

final TreeNode<K,V> putTreeVal(int h, K k, V v) {

    Class<?> kc = null;

    boolean searched = false;

    for (TreeNode<K,V> p = root;;) {

        int dir, ph; K pk;

        if (p == null) {

            first = root = new TreeNode<K,V>(h, k, v, null, null);

            break;

        }

        else if ((ph = p.hash) > h)

            dir = -1;             //代表是左节点

        else if (ph < h)

            dir = 1;              //代表的是右节点

        else if ((pk = p.key) == k || (pk != null && k.equals(pk)))

            return p;                                                                 //相等返回红黑树的值

        else if ((kc == null &&

                  (kc = comparableClassFor(k)) == null) ||           //表示该类本身不可比,即没有实现 Comparable<C>接口

                 (dir = compareComparables(kc, k, pk)) == 0) {        //表示k与pk代表的类不可比  

            if (!searched) {  //仅在p为root时生效,遍历比较左右子树中是否存在与插入节点相等的值

                TreeNode<K,V> q, ch;

                searched = true;

                if (((ch = p.left) != null &&

                     (q = ch.findTreeNode(h, k, kc)) != null) ||

                    ((ch = p.right) != null &&

                     (q = ch.findTreeNode(h, k, kc)) != null))

                    return q;   //相等就把相等的值返回

            }

            dir = tieBreakOrder(k, pk); //将对象的内存地址生成的hashcode进行比较

        }

 

        TreeNode<K,V> xp = p;

        if ((p = (dir <= 0) ? p.left : p.right) == null) {      //p是红黑树的节点,第一次是root后面是其子节点循环,一直到空进行插入操作

            TreeNode<K,V> x, f = first;     

            first = x = new TreeNode<K,V>(h, k, v, f, xp);      

            if (f != null)

                f.prev = x;

            if (dir <= 0)

                xp.left = x;

            else                    //因为红色不能连续,所以如果xp不是红的,添加的就可以是红的,添加黑的导致这条线黑色节点                                      //过多,出现错误,如果xp是红色的,由于红色不能连续,只能是黑的,因此就会平衡使得每条线                                      //的黑色是一致的

                xp.right = x;

            if (!xp.red)           //是黑色的节点,就直接把添加的节点设置为红色

                x.red = true;

            else {                                    //否则就要进行红黑树的变化旋转了

                lockRoot();                         //添加状态 CAS操作,代表这个红黑是进行平衡操作中

                try {                       

                    root = balanceInsertion(root, x); //红黑树的平衡操作了

                } finally { 

                    unlockRoot();           //添加的过程是加锁的 所以加好之后肯定释放锁了

                }

            }

            break;

        }

    }  //for循环到此结束。一旦跳出循环 意味着已经添加进去了

    assert checkInvariants(root); //在进行一次检查

    return null;

}

 

如果添加节点的父节点是黑色节点,则可以直接添加节点设为红色,结束,否则的话就只能添加黑色节点,导致再平衡

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值