java hashmap 的 remove 方法先通过 hash 定位桶位置,再分链表或红黑树查找并断开引用;null key 固定在索引 0 处处理;最后更新 modcount 和 size。

Java HashMap 的 remove 方法删除节点时,并不是简单地“找完就删”,而是结合哈希桶(数组)、链表/红黑树结构,按实际存储形态分情况处理。核心逻辑是先定位桶位置,再在该桶的链表或红黑树中查找并断开引用。
定位桶位置:通过 hash 值计算下标
HashMap 先用键的 hashCode() 计算扰动后的 hash 值(高位参与运算),再与数组长度减一做 & 运算,快速定位到对应的桶(tab[i])。如果该位置为 null,直接返回 null,表示没找到。
遍历桶内结构:区分链表和红黑树两种情况
找到桶后,根据该位置首节点类型分别处理:
-
普通 Node(链表):从头节点开始逐个比对 key 的
equals()(同时检查 hash 值是否一致),找到匹配节点后,调整前驱节点的next指针跳过它;如果是头节点,直接把tab[i]指向其next。 -
TreeNode(红黑树):调用
treeNode.removeTreeNode(this, tab, movable),内部会先查找到目标节点,再执行红黑树的标准删除 + 平衡操作(旋转、变色等),最后可能退化为链表(当树中节点 ≤ 6 时)。
处理特殊情况:key 为 null 的情况
HashMap 允许 key 为 null,且只允许一个。它被固定放在桶索引为 0 的位置(因为 null.hashCode() 抛异常,所以单独处理)。删除时会专门检查 tab[0] 处的链表,找到 key == null 的节点并移除。
更新元信息:修改 modCount 和 size
删除成功后,HashMap 会将 modCount 加 1(用于 fail-fast 检测),并将 size 减 1。这两个字段不涉及并发安全,纯属结构性维护。
整个过程不涉及内存主动清理(如置 null),JVM 会在后续 GC 中回收无引用的对象。关键在于准确断开链表指针或完成红黑树重构,让被删节点不可达。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











