您的位置:

深入剖析Java中的Map.getOrDefault方法

在Java的Map中,getOrDefault方法是一个非常有用的方法,如果键不存在于Map中,则返回默认值而不是null。本文通过深入探讨该方法的实现和使用,向读者展示其强大的功能和灵活性。

一、getOrDefault 方法的语法和基础用法

getOrDefault 方法的基础用法非常简单,下面是它的语法:

V getOrDefault(Object key, V defaultValue)

其中,key 代表 Map 中要查找的键,defaultValue 是当键不存在于 Map 中时返回的默认值。事实上,如果键 key 存在于 Map 中,getOrDefault 将返回与其关联的值,否则将返回 defaultValue。

下面是一个基本的示例:

Map map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);

int value1 = map.getOrDefault("A", 0);//返回1
int value2 = map.getOrDefault("C", 0);//返回0

  

在以上示例中,对于 map.getOrDefault("A", 0) 调用,由于键 "A" 存在于 Map 中,该方法将返回 1。而对于 map.getOrDefault("C", 0) 调用,由于搜寻键 "C" 找不到,所以将返回默认值 0。

二、getOrDefault 方法的实现原理

接下来,我们将讨论 getOrDefault 方法实现的内部机制。事实上,在 HashMap 和 ConcurrentHashMap 等常用的 Java Map 实现中,getOrDefault 方法的实现与 get 方法基本相同。

在 HashMap 中,getOrDefault 方法的实现如下:

public V getOrDefault(Object key, V defaultValue) {
    Node e;
    return (e = getNode(hash(key), key)) == null ? defaultValue : e.value;
}

  

在以上代码中,getNode 是 HashMap 中一个私有方法,它用于在 HashMap 中查找给定键的节点。如果该节点存在,则将其与 defaultValue 进行比较,否则将返回 defaultValue。

同样地,在 ConcurrentHashMap 中,getOrDefault 方法的实现也类似:

public V getOrDefault(Object key, V defaultValue) {
    V v;
    return (v = get(key)) == null ? defaultValue : v;
}

事实上,ConcurrentHashMap 的 getOrDefault 方法完全依靠 get 方法的实现,只是在实现中添加了 defaultValue 的逻辑。

三、getOrDefault 方法的高级用法

除了基本的用法外,getOrDefault 方法还提供了一些高级用法,下面是其中的一些示例。

示例1:使用 Lambda 表达式设置默认值

在Java 8 中,使用 Lambda 表达式可以轻松地将默认值与函数的返回值相结合,从而实现一些更为复杂的任务。

Map> listMap = new HashMap<>();
List
    value = listMap.getOrDefault("key", new ArrayList<>(), List::isEmpty);//返回true

   
  

在以上示例中,我们使用了一个 Lambda 表达式,它检查了 listMap 中 "key" 的值是否为空。该表达式将在返回默认值时使用,并且只有在值为空时才会返回。

示例2:结合 putIfAbsent 方法使用

putIfAbsent 是 Map 接口中的另一个非常实用的方法。它实现了一种常见的任务:在给定的键不存在于 Map 中时,将其与给定的值关联,否则,返回已经与该键相关联的当前值。

与此一致,在一些具有特定需求的情况下,我们希望检查某个键是否存在,如果存在,返回相关的值,如果不存在,则将一个新值放置在其中。

Map map = new HashMap<>();
int defaultValue = 0;
String key = "key";

int existingValue = map.putIfAbsent(key, defaultValue);

if (existingValue != null) {
    // 键在Map中已经存在
    return existingValue;
}

// 键在Map中不存在,那就使用defaultValue并放置一个新值
return defaultValue;

  

示例3:获取某个键的值时同时更新该项

在一些特定情境下,我们希望获取某个键的值,并且在确定的情况下对其进行更新。这时,我们可以利用 getOrDefault 的 Value 参数来源于代码块的特性。

Map> map = new HashMap<>();
String key = "key";
List
    newList = new ArrayList<>();

List
     existingList = map.getOrDefault(key, new ArrayList<>());

if (!existingList.isEmpty()) {
    // 键在Map中已经存在
    map.put(key, existingList);
} else {
    // 键在Map中不存在
    map.put(key, newList);
}

    
   
  

在以上示例中,我们使用 getOrDefault 方法来检查键 key 是否存在。如果键已经存在于 Map 中,则 put 方法的操作将更新其值。如果不存在,则默认值将被设置为新的 List 对象。

结语

本文深入讨论了 Map 的 getOrDefault 方法:它的语法和基础用法,它的实现原理,以及一些高级用法。

对于熟练地使用 Java Map 的开发人员来说,getOrDefault 方法已经成为他们编写更灵活和高效代码的有力武器。然而,即使是这些开发人员,也应该通过不断地学习和尝试来更好地利用它的潜力。