HashMap源码解析(四) removeNode方法

final HashMap.Node removeNode(int hash, Object key, Object value, boolean matchValue, boolean movable) {
        //获取临时变量tab存储table数组
        HashMap.Node[] tab;
        HashMap.Node p;
        int n;
        int index;
        //获取n为table长度,index为hash后的位置
        //如果当前table已经初始化,且index位置上的元素不为空,则进入if判断,准备查找需要删除的元素
        if ((tab = this.table) != null && (n = tab.length) > 0 && (p = tab[index = n - 1 & hash]) != null) {
            HashMap.Node node = null;
            Object k;
            //如果当前index位置上第一个元素则是需要被删除的元素,则将node指定为p,开始删除
            //如果不是则进入else循环开始查找
            if (p.hash == hash && ((k = p.key) == key || key != null && key.equals(k))) {
                node = p;
            } else {
                HashMap.Node e;
                //如果当前index位置上下一个元素不为空,则判断类型进行查找
                if ((e = p.next) != null) {
                    //如果index位置为红黑树,则调用树的查找
                    if (p instanceof HashMap.TreeNode) {
                        node = ((HashMap.TreeNode)p).getTreeNode(hash, key);
                    } else {
                        //如果当前index位置为链表,则循环向后查找
                        label88: {
                            while(e.hash != hash || (k = e.key) != key && (key == null || !key.equals(k))) {
                                p = e;
                                if ((e = e.next) == null) {
                                    break label88;
                                }
                            }
                            //将node指定为e,不论e是否为null.
                            node = e;
                        }
                    }
                }
            }
            //如果node不为null,则代表查找到key值对应的元素
            Object v;
            if (node != null && (!matchValue || (v = ((HashMap.Node)node).value) == value || value != null && value.equals(v))) {
                //如果被查找到的node类型为树类型,则调用树的删除方法
                if (node instanceof HashMap.TreeNode) {
                    ((HashMap.TreeNode)node).removeTreeNode(this, tab, movable);
                }
                //如果node==p,则代表是index当前位置的第一个元素被查找到,直接将index位置的元素后移即可.
                else if (node == p) {
                    tab[index] = ((HashMap.Node)node).next;
                }
                //如果不是第一个元素,则将查找到元素的前一个元素的next指针指向被查找到的元素的next元素,即可实现删除
                else {
                    p.next = ((HashMap.Node)node).next;
                }
                //将操作数加一
                ++this.modCount;
                //将map中元素个数减一
                --this.size;
                this.afterNodeRemoval((HashMap.Node)node);
                //返回被删除的元素
                return (HashMap.Node)node;
            }
        }

        return null;
    }

 

你可能感兴趣的:(HashMap源码,周常)