[轉載] Java 遍歷 Map 的 5 種方式

来源:https://www.cnblogs.com/shoufeng/archive/2019/10/31/11774640.html
-Advertisement-
Play Games

Map 是 Java 中使用非常廣泛的一類集合, 對於它的遍歷訪問, 有多種方法, 本篇轉載記錄常見的5種方法, 並給出各自的適用場景作為參考. ...


目錄


版權聲明: 本文為轉載文章, 轉載時有適量修改. 再次轉載時請附上原文出處鏈接和本聲明.
作者:zhaoguhong(趙孤鴻)
出處:http://www.cnblogs.com/zhaoguhong

Java 中遍歷 Map 有多種方法, 從最早的迭代器 Iterator, 到 JDK 5 開始支持的增強型 for 迴圈 —— 即 foreach, 再到 JDK 8 的 Lambda 表達式, 讓我們一起來看下具體的用法及其優缺點.

1 通過 keySet() 或 values() 方法遍歷

如果只需要獲取 Map 的 key 或者 value, 通過 Map 的 keySet()values() 方法無疑是最方便的:


public class TestMap {
    /**
     * Map 的擴容比較消耗性能, 因此若能確定存儲數據的大小,
     * 在初始化時指定初始容量是一個不錯的實踐技巧
     */
    private static Map<Integer, Integer> map = new HashMap<>(16);

    /** keySet 獲取 key */
    public void testKeySet() {
        for (Integer key : map.keySet()) {
          System.out.println(key);
        }
    }
    /** values 獲取 value */
    public void testValues() {
        for (Integer value : map.values()) {
            System.out.println(value);
        }
    }
}

2 通過 keySet 的 get(key) 獲取值

如果需要同時獲取 key 和 value, 可以通過先獲取 key, 然後再通過 Map 的 get(key) 獲取對應的 value.

註意: 該方法不是最優選擇, 一般不推薦使用.

    /** keySet get(key) 獲取key and value */
    public void testKeySetAndGetKey() {
        for (Integer key : map.keySet()) {
            System.out.println(key + ":" + map.get(key));
        }
    }

3 通過 entrySet 遍歷

通過對 Map 的 entrySet 進行遍歷, 也可以同時拿到 key 和 value.

該方法是最常用的遍歷 Map 的方法, 大多情況下, 其性能要優於第2種.

  /** 
    * entrySet 獲取 key 和 value, Entry 是 Map 內部存儲數據的邏輯容器
    */ 
  public void testEntry() {
    for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
      System.out.println(entry.getKey() + ":" + entry.getValue());
    }
  }

4 通過迭代器 Iterator 遍歷

上面的幾種遍歷方法都用了增強型 for 迴圈 —— foreach, 這是 JDK 5 開始才有的特性.

foreach 的操作雖然看起來很簡潔, 但有一個劣勢: 遍歷 Map 時, 如果改變其大小, 就會拋出併發修改異常. 但如果在遍歷時只需要刪除 Map 中的元素, 那就可以用 Iterator 的 remove() 方法刪除元素:

    /** Iterator 獲取 key 和 value */
    public void testIterator() {
        Iterator<Map.Entry<Integer, Integer>> it = map.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry<Integer, Integer> entry = it.next();
            System.out.println(entry.getKey() + ":" + entry.getValue());
            // 刪除元素
            // it.remove();
        }
    }

5 通過 Lambda 表達式遍歷

JDK 8 提供了 Lambda 表達式支持, 其語法看起來更簡潔, 可以同時拿到 key 和 value.

不過, 經過簡單的測試, Lambda 表達式遍歷 Map 的速度要低於 entrySet 遍歷的方式, 所以更推薦用 entrySet 去遍歷 Map.

    /** Lambda 獲取key and value */
    public void testLambda() {
        map.forEach((key, value) -> {
            System.out.println(key + ":" + value);
        });
    }

6 總結 - 遍歷 Map 的實踐建議

(1) 如果只獲取 key 或者 value, 推薦使用 keySet()values() 方法;

(2) 如果需要同時獲取 key 和value, 推薦使用 entrySet;

(3) 如果需要在遍歷過程中刪除元素, 推薦使用 Iterator;

(4) 如果需要在遍歷過程中添加元素, 可以新建一個臨時 Map 存放新增的元素, 遍歷結束後, 再把臨時 Map 添加到原 Map 中.

版權聲明

本文版權歸原作者所有, 如有侵權, 請聯繫博主, 定當立即刪除.

若要轉載, 請在文章頁面明顯位置標明原始鏈接, 否則一切責任自負.


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.代碼生成器: [正反雙向](單表、主表、明細表、樹形表,快速開發利器)freemaker模版技術 ,0個代碼不用寫,生成完整的一個模塊,帶頁面、建表sql腳本、處理類、service等完整模塊2.多數據源:(支持同時連接無數個資料庫,可以不同的模塊連接不同數的據庫)支持N個數據源3.阿裡資料庫連 ...
  • Java 程式員第一個要瞭解的基礎概念就是: "什麼是面向對象編程(OOP)" ? 玩過 DOTA2 (一款推塔殺人的游戲)嗎?裡面有個齊天大聖的角色,歐洲戰隊玩的很溜,國內戰隊卻不怎麼會玩,自家人不會玩自家的神話英雄,實在有點悲哀。 我們用 Java 定義一個孫悟空的類吧: 我們給他兩個屬性(生命 ...
  • 這篇文章主要簡單的介紹下 Nginx 的相關知識,主要包括以下幾部分內容: 1. Nginx 適用於哪些場景? 2. 為什麼會出現 Nginx? 3. Nginx 優點 4. Nginx 的編譯與配置 Nginx 適用於哪些場景? 如圖所示,一個請求會先經過 Nginx 到達應用服務層,然後再去訪問 ...
  • Date 10.06 pm Point 完成beanfactory中單例bean的初始化 beanFactory.preInstantiateSingletons() 1. 拿到所有的bean定義信息(在 中,遍歷list 2. 獲取到bean的定義信息 3. 如果這個bean不是抽象,是單例,不是 ...
  • 使用 Spring Boot 構建 RESTful Web API ...
  • while迴圈語句及練習題 Python 編程中 while 語句用於迴圈執行程式,即在某條件下,迴圈執行某段程式,以處理需要重覆處理的相同任務。其基本形式為: while 判斷條件: 執行語句...... 執行語句可以是單個語句或語句塊。判斷條件可以是任何表達式,任何非零、或非空(null)的值均 ...
  • 一、線上工具 1.https://www.sojson.com/ 2.http://www.w3cshool.com.cn/json/ 3.http://www.runoob.com/json/json-tutorial.html 二、JSON(JavaScriptObjectNotation) 1 ...
  • 當一個函數在其函數體內調用自身時,則稱之為遞歸,遞歸函數對於解決數學上的問題是非常有用的,比如計算階乘,生成斐波那契數列等 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...