反复撸码HashMap源码,扫盲代码中的remove、getOrDefault方法
2024-02-01 07:27:25
深入剖析 HashMap 源码:揭秘 remove 和 getOrDefault 方法
引言
在 Java 集合框架中,HashMap 是一款至关重要的数据结构,它使用键值对来存储数据。要从 HashMap 中删除键值对,我们会使用 remove 方法;要获取键对应的值,我们会用到 getOrDefault 方法。本文将深入分析 HashMap 中这两个方法的源码,带你领略它们的运作原理和应用方式。
remove 方法
当我们调用 remove 方法时,它首先会计算键的哈希值,以此确定键值对在 HashMap 中的位置。接着,它会遍历链表,寻找与该键匹配的键值对。如果找到匹配项,就会将其从链表中删除并返回该键对应的值。如果找不到匹配项,方法将返回 null。
public V remove(Object key) {
int hash = hash(key.hashCode());
Entry<K,V> prev = null;
Entry<K,V> e = table[indexFor(hash, table.length)];
while (e != null) {
if (e.hash == hash && e.key.equals(key)) {
if (prev == null)
table[indexFor(hash, table.length)] = e.next;
else
prev.next = e.next;
size--;
modCount++;
return e.value;
}
prev = e;
e = e.next;
}
return null;
}
getOrDefault 方法
与 remove 方法类似,getOrDefault 方法首先会调用 get 方法获取键对应的值。如果 get 方法返回 null,则返回默认值。否则,返回 get 方法返回的值。
public V getOrDefault(Object key, V defaultValue) {
V v;
return (v = get(key)) != null ? v : defaultValue;
}
使用方法
掌握了 HashMap 中 remove 和 getOrDefault 方法的运作原理,接下来我们来看看如何实际使用它们。
删除键值对
HashMap<String, Integer> map = new HashMap<>();
map.put("John", 25);
map.put("Mary", 30);
map.put("Bob", 35);
map.remove("John");
获取键值
Integer age = map.getOrDefault("Mary", 0);
常见问题解答
-
remove 方法和 getOrDefault 方法的复杂度是多少?
这两个方法的时间复杂度为 O(1),在理想情况下,它们可以在常数时间内执行。
-
getOrDefault 方法是否会修改 HashMap?
不会。getOrDefault 方法仅用于获取值,不会对 HashMap 做任何修改。
-
我可以使用 remove 方法删除 null 键吗?
是的,你可以使用 remove 方法删除 null 键。
-
我可以使用 getOrDefault 方法获取 null 值吗?
是的,你可以使用 getOrDefault 方法获取 null 值。如果你不提供默认值,getOrDefault 方法会返回 null。
-
什么时候应该使用 remove 方法,什么时候应该使用 getOrDefault 方法?
当需要从 HashMap 中删除键值对时,应使用 remove 方法。当需要获取键对应的值,并且该键可能不存在时,应使用 getOrDefault 方法。
结语
HashMap 中的 remove 和 getOrDefault 方法是两大利器,可助你轻松从 HashMap 中删除键值对和获取键对应的值。通过深入了解它们的运作原理和使用方法,你可以更有效地利用 HashMap 来管理你的数据。