hashMap 删除方法 remove()详解

删除方法就是首先先找到元素的位置,如果是链表就遍历链表找到元素之后删除。如果是用红黑树就遍历树然后找到之后做删除,树小于 6 的时候要转链表。 删除 remove() 方法: ```java // remove方法的具体实现在removeNode方法中,所以我们重点看下removeNode方法 public V remove(Object key) { Node<K,V> e; return (e = removeNode(hash(key), key, null, false, true)) == null ? null : e.value; } ``` removeNode() 方法: ```java 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; // 根据hash找到位置 // 如果当前key映射到的桶不为空 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; // 如果桶上的结点就是要找的key,则将node指向该结点 if (p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k)))) node = p; else if ((e = p.next) != null) { // 说明结点存在下一个结点 if (p instanceof TreeNode) // 说明是以红黑树来处理的冲突,则获取红黑树要删除的结点 node = ((TreeNode<K,V>)p).getTreeNode(hash, key); else { // 判断是否以链表方式处理hash冲突,是的话则通过遍历链表来寻找要删除的结点 do { if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))) { node = e; break; } p = e; } while ((e = e.next) != null); } } // 比较找到的key的value和要删除的是否匹配 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; } ```