/** * 函数:remove(Object key) * 作用:删除该键值对 * @return 返回被删除的value值,如果删除失败返回Null */ public V remove(Object key) { Entry<K,V> e = removeEntryForKey(key); // 返回移除的节点的value值 return (e == null ? null : e.value); } final Entry<K,V> removeEntryForKey(Object key) { // HashMap为空,直接返回Null if (size == 0) { return null; } // 1. 计算hash值 int hash = (key == null) ? 0 : hash(key); // 2. 计算存储的数组下标位置 int i = indexFor(hash, table.length); // 定位到key值对应的数组位置 // prev在后面遍历链表时指向当前节点的前一个节点,e表示当前遍历到的节点 Entry<K,V> prev = table[i]; Entry<K,V> e = prev; // 遍历链表,找到key和hash值与传入参入相同的节点,即为要删除的节点 while (e != null) { // 记录当前节点的下一个节点 Entry<K,V> next = e.next; Object k; // 如果key值和hash值相同,则找到目标节点。执行移除操作 if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))) { // 记录map结构被修改的次数,主要用于并发编程 modCount++; // 记录table存储了多少键值对,因为移除了一个,所以此处就减一 size--; // 若删除的是table数组中的元素(即链表的头结点) // 则删除操作 = 将头结点的next引用存入table[i]中 if (prev == e) table[i] = next; //否则 将以table[i]为头结点的链表中,当前Entry的前1个Entry中的next 设置为 当前Entry的next(即删除当前Entry = 直接跳过当前Entry) else prev.next = next; e.recordRemoval(this); return e; } prev = e; e = next; } // 返回删除的节点 return e; }
JDK1.7中HashMap的remove()源码详解
最新推荐文章于 2023-04-07 17:55:17 发布