深入剖析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<String, List> 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<String, List> 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 方法已经成为他们编写更灵活和高效代码的有力武器。然而,即使是这些开发人员,也应该通过不断地学习和尝试来更好地利用它的潜力。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/244200.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-12 13:00
下一篇 2024-12-12 13:00

相关推荐

  • java client.getacsresponse 编译报错解决方法

    java client.getacsresponse 编译报错是Java编程过程中常见的错误,常见的原因是代码的语法错误、类库依赖问题和编译环境的配置问题。下面将从多个方面进行分析…

    编程 2025-04-29
  • Java JsonPath 效率优化指南

    本篇文章将深入探讨Java JsonPath的效率问题,并提供一些优化方案。 一、JsonPath 简介 JsonPath是一个可用于从JSON数据中获取信息的库。它提供了一种DS…

    编程 2025-04-29
  • Java腾讯云音视频对接

    本文旨在从多个方面详细阐述Java腾讯云音视频对接,提供完整的代码示例。 一、腾讯云音视频介绍 腾讯云音视频服务(Cloud Tencent Real-Time Communica…

    编程 2025-04-29
  • Java Bean加载过程

    Java Bean加载过程涉及到类加载器、反射机制和Java虚拟机的执行过程。在本文中,将从这三个方面详细阐述Java Bean加载的过程。 一、类加载器 类加载器是Java虚拟机…

    编程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介绍

    本文将详细介绍Java Milvus SearchParam withoutFields的相关知识和用法。 一、什么是Java Milvus SearchParam without…

    编程 2025-04-29
  • 解决.net 6.0运行闪退的方法

    如果你正在使用.net 6.0开发应用程序,可能会遇到程序闪退的情况。这篇文章将从多个方面为你解决这个问题。 一、代码问题 代码问题是导致.net 6.0程序闪退的主要原因之一。首…

    编程 2025-04-29
  • ArcGIS更改标注位置为中心的方法

    本篇文章将从多个方面详细阐述如何在ArcGIS中更改标注位置为中心。让我们一步步来看。 一、禁止标注智能调整 在ArcMap中设置标注智能调整可以自动将标注位置调整到最佳显示位置。…

    编程 2025-04-29
  • Python中init方法的作用及使用方法

    Python中的init方法是一个类的构造函数,在创建对象时被调用。在本篇文章中,我们将从多个方面详细讨论init方法的作用,使用方法以及注意点。 一、定义init方法 在Pyth…

    编程 2025-04-29
  • Python创建分配内存的方法

    在python中,我们常常需要创建并分配内存来存储数据。不同的类型和数据结构可能需要不同的方法来分配内存。本文将从多个方面介绍Python创建分配内存的方法,包括列表、元组、字典、…

    编程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java语言中的一个版本,于2014年3月18日发布。本文将从多个方面对Java 8中某一周的周一进行详细的阐述。 一、数组处理 Java 8新特性之一是Stream…

    编程 2025-04-29

发表回复

登录后才能评论