1. final Node<K,V> removeNode(int hash, Object key, Object value,
    2. boolean matchValue, boolean movable) {
    3. Node<K,V>[] tab; Node<K,V> p; int n, index;
    4. if ((tab = table) != null && (n = tab.length) > 0 &&
    5. (p = tab[index = (n - 1) & hash]) != null) {
    6. Node<K,V> node = null, e; K k; V v;
    7. if (p.hash == hash &&
    8. ((k = p.key) == key || (key != null && key.equals(k)))) //删除节点在数组上
    9. node = p;
    10. else if ((e = p.next) != null) {
    11. if (p instanceof TreeNode) //删除节点在树上
    12. node = ((TreeNode<K,V>)p).getTreeNode(hash, key);
    13. else { // 删除节点在链表上
    14. do {
    15. if (e.hash == hash &&
    16. ((k = e.key) == key ||
    17. (key != null && key.equals(k)))) {
    18. node = e;
    19. break;
    20. }
    21. p = e;
    22. } while ((e = e.next) != null);
    23. }
    24. }
    25. //matchValue的作用是指现在是否需要值匹配。因为可能没有传入value,所以判断一下
    26. if (node != null && (!matchValue || (v = node.value) == value ||
    27. (value != null && value.equals(v)))) { //
    28. if (node instanceof TreeNode) // 红黑树执行删除元素操作
    29. ((TreeNode<K,V>)node).removeTreeNode(this, tab, movable);
    30. else if (node == p) // 如果要删除的node正好是首个元素
    31. tab[index] = node.next;
    32. else
    33. p.next = node.next; //执行链表元素的删除操作
    34. ++modCount;
    35. --size;
    36. afterNodeRemoval(node); //空方法 留给子类拓展 比如LinkedHashMap
    37. return node;
    38. }
    39. }
    40. return null;
    41. }