深入理解HashMap(五)remove方法解析

remove作为核心方法之一,也是我们需要掌握的重点,来看一下remove方法:
深入理解HashMap(五)remove方法解析_第1张图片
可以看出,remove方法中调用了removeNode方法,进去removeNode方法:

 final Node<K,V> removeNode(int hash, Object key, Object value,
                               boolean matchValue, boolean movable) {
        Node<K,V>[] tab; Node<K,V> p; int n, index;
        //当table不为空,并且hash对应的桶不为空时
        if ((tab = table) != null && (n = tab.length) > 0 &&
            (p = tab[index = (n - 1) & hash]) != null) {
            Node<K,V> node = null, e; K k; V v;
            //桶中的头节点就是我们要删除的节点
            if (p.hash == hash &&
                ((k = p.key) == key || (key != null && key.equals(k))))
                //用node记录要删除的头节点
                node = p;
            //头节点不是要删除的节点,并且头节点之后还有节点
            else if ((e = p.next) != null) {
            	//头节点为树节点,则进入树查找要删除的节点
                if (p instanceof TreeNode)
                    node = ((TreeNode<K,V>)p).getTreeNode(hash, key);
                //头节点为链表节点
                else {
                	//遍历链表
                    do {
                    	//hash值相等,并且key地址相等或者equals
                        if (e.hash == hash &&
                            ((k = e.key) == key ||
                             (key != null && key.equals(k)))) {
                             //node记录要删除的节点
                            node = e;
                            break;
                        }
                        //p保存当前遍历到的节点
                        p = e;
                    } while ((e = e.next) != null);
                }
            }
            //我们要找的节点不为空
            if (node != null && (!matchValue || (v = node.value) == value ||
                                 (value != null && value.equals(v)))) {
                if (node instanceof TreeNode)
                	//在树中删除节点
                    ((TreeNode<K,V>)node).removeTreeNode(this, tab, movable);
                //我们要删除的是头节点
                else if (node == p)
                    tab[index] = node.next;
                //不是头节点,将当前节点指向删除节点的下一个节点
                else
                    p.next = node.next;
                ++modCount;
                --size;
                afterNodeRemoval(node);
                return node;
            }
        }
        return null;
    }

removeNode方法和putVal方法非常的像,这两者本来就是一个删一个增,所以在代码上有共性。我之前的文章put方法解析中有更详细的说明,可以参考一下~

传送门

深入理解HashMap(一)hashmap所用算法、构造函数

深入理解HashMap(二)put方法解析

深入理解HashMap(三)resize方法解析

深入理解HashMap(四)get方法解析

深入理解HashMap(五)remove方法解析

你可能感兴趣的:(Java)