返回

反复撸码HashMap源码,扫盲代码中的remove、getOrDefault方法

闲谈

深入剖析 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);

常见问题解答

  1. remove 方法和 getOrDefault 方法的复杂度是多少?

    这两个方法的时间复杂度为 O(1),在理想情况下,它们可以在常数时间内执行。

  2. getOrDefault 方法是否会修改 HashMap?

    不会。getOrDefault 方法仅用于获取值,不会对 HashMap 做任何修改。

  3. 我可以使用 remove 方法删除 null 键吗?

    是的,你可以使用 remove 方法删除 null 键。

  4. 我可以使用 getOrDefault 方法获取 null 值吗?

    是的,你可以使用 getOrDefault 方法获取 null 值。如果你不提供默认值,getOrDefault 方法会返回 null。

  5. 什么时候应该使用 remove 方法,什么时候应该使用 getOrDefault 方法?

    当需要从 HashMap 中删除键值对时,应使用 remove 方法。当需要获取键对应的值,并且该键可能不存在时,应使用 getOrDefault 方法。

结语

HashMap 中的 remove 和 getOrDefault 方法是两大利器,可助你轻松从 HashMap 中删除键值对和获取键对应的值。通过深入了解它们的运作原理和使用方法,你可以更有效地利用 HashMap 来管理你的数据。