跳转至

Java HashMap 的 getOrDefault 和 putIfAbsent 方法:深入解析与实践

简介

在 Java 编程中,HashMap 是一个极为常用的数据结构,用于存储键值对。getOrDefaultputIfAbsent 这两个方法为 HashMap 的使用带来了更多便利和灵活性。本文将深入探讨这两个方法的基础概念、使用方式、常见实践以及最佳实践,帮助读者更好地掌握和运用它们。

目录

  1. getOrDefault 基础概念
  2. getOrDefault 使用方法
  3. putIfAbsent 基础概念
  4. putIfAbsent 使用方法
  5. 常见实践
  6. 最佳实践
  7. 小结
  8. 参考资料

getOrDefault 基础概念

getOrDefault 方法是 HashMap 类中的一个方法,它的作用是根据指定的键获取对应的值。如果键不存在于 HashMap 中,则返回一个默认值。这个方法提供了一种简洁的方式来处理可能不存在的键,避免了手动检查键是否存在并返回默认值的繁琐操作。

getOrDefault 使用方法

getOrDefault 方法的签名如下:

V getOrDefault(Object key, V defaultValue)

其中,key 是要查找的键,defaultValue 是如果键不存在时返回的值。

以下是一个简单的示例:

import java.util.HashMap;
import java.util.Map;

public class GetOrDefaultExample {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("one", 1);
        map.put("two", 2);

        // 获取存在的键的值
        int value1 = map.getOrDefault("one", 0);
        System.out.println("Value for 'one': " + value1); 

        // 获取不存在的键的值,返回默认值
        int value2 = map.getOrDefault("three", 0);
        System.out.println("Value for 'three': " + value2); 
    }
}

在上述示例中,map.getOrDefault("one", 0) 会返回键 "one" 对应的值 1,因为键 "one" 存在于 HashMap 中。而 map.getOrDefault("three", 0) 会返回默认值 0,因为键 "three" 不存在。

putIfAbsent 基础概念

putIfAbsent 方法用于将指定的键值对插入到 HashMap 中。只有当指定的键不存在于 HashMap 中,或者该键对应的值为 null 时,才会执行插入操作。如果键已经存在且值不为 null,则不会对 HashMap 进行任何修改。

putIfAbsent 使用方法

putIfAbsent 方法的签名如下:

V putIfAbsent(K key, V value)

其中,key 是要插入的键,value 是要插入的值。该方法返回键对应的值,如果键是新的,则返回 null;如果键已存在,则返回当前键对应的值。

以下是一个示例:

import java.util.HashMap;
import java.util.Map;

public class PutIfAbsentExample {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("one", 1);

        // 插入新的键值对
        Integer result1 = map.putIfAbsent("two", 2);
        System.out.println("Insert 'two': " + result1); 

        // 尝试插入已存在的键
        Integer result2 = map.putIfAbsent("one", 10);
        System.out.println("Insert 'one': " + result2); 

        System.out.println(map);
    }
}

在上述示例中,map.putIfAbsent("two", 2) 会插入键值对 "two": 2,因为键 "two" 不存在,方法返回 null。而 map.putIfAbsent("one", 10) 不会插入新的值,因为键 "one" 已经存在,方法返回当前键对应的值 1

常见实践

统计单词出现次数

import java.util.HashMap;
import java.util.Map;

public class WordCountExample {
    public static void main(String[] args) {
        String[] words = {"apple", "banana", "apple", "cherry", "banana"};
        Map<String, Integer> wordCountMap = new HashMap<>();

        for (String word : words) {
            wordCountMap.putIfAbsent(word, 0);
            wordCountMap.put(word, wordCountMap.get(word) + 1);
        }

        System.out.println(wordCountMap);
    }
}

在这个示例中,我们使用 putIfAbsent 确保每个单词在 HashMap 中都有一个初始的计数为 0,然后使用普通的 put 方法更新计数。

获取默认值并进行操作

import java.util.HashMap;
import java.util.Map;

public class GetAndOperateExample {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("one", 1);

        int value = map.getOrDefault("one", 0) + 1;
        map.put("one", value);

        System.out.println(map);
    }
}

这里我们使用 getOrDefault 获取键对应的值,并在其基础上进行操作,然后更新 HashMap

最佳实践

减少空指针检查

使用 getOrDefault 可以显著减少手动进行空指针检查的代码,使代码更加简洁和易读。例如:

Map<String, String> map = new HashMap<>();
// 传统方式
String value1 = map.get("key");
if (value1 == null) {
    value1 = "default value";
}

// 使用 getOrDefault
String value2 = map.getOrDefault("key", "default value");

原子性插入操作

在多线程环境中,putIfAbsent 方法提供了原子性的插入操作,避免了竞争条件。例如:

import java.util.concurrent.ConcurrentHashMap;

public class ConcurrentPutIfAbsentExample {
    public static void main(String[] args) {
        ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
        map.putIfAbsent("key", 1);
    }
}

小结

getOrDefaultputIfAbsent 方法为 HashMap 的使用提供了更多的便利和功能。getOrDefault 简化了获取值并处理默认值的操作,而 putIfAbsent 则方便了在键不存在时进行插入操作,并且在多线程环境中有原子性的优势。通过合理运用这两个方法,可以使代码更加简洁、高效和健壮。

参考资料

希望通过本文,读者能够深入理解并熟练运用 Java HashMapgetOrDefaultputIfAbsent 方法。