深入剖析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/zh-hk/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

發表回復

登錄後才能評論