最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中Map集合遍歷的多種實(shí)現(xiàn)方式

 更新時(shí)間:2025年05月29日 09:32:39   作者:AA-代碼批發(fā)V哥  
本文主要介紹了Java中Map集合遍歷的多種實(shí)現(xiàn)方式,包括KeySet、EntrySet、Lambda及Stream API,具有一定的參考價(jià)值,感興趣的可以了解一下

Java中Map 集合是存儲(chǔ)鍵值對(duì)數(shù)據(jù)的重要容器,而高效遍歷 Map 則是日常開發(fā)中的常見需求。本文我將從基礎(chǔ)到高級(jí),全面介紹 Java 中 Map 集合的各種遍歷方式,并分析它們的優(yōu)缺點(diǎn)和適用場(chǎng)景,幫你在不同場(chǎng)景下做出最優(yōu)選擇。

一、Map 集合概述

Map 是 Java 集合框架中的重要接口,它存儲(chǔ)鍵值對(duì)(Key-Value)映射關(guān)系,其中鍵(Key)具有唯一性。常見的實(shí)現(xiàn)類有 HashMap、TreeMap、LinkedHashMap 和 ConcurrentHashMap 等。Map 接口本身不是 Collection 的子接口,但它提供了三種視圖:

  • KeySet:鍵的集合
  • Values:值的集合
  • EntrySet:鍵值對(duì)的集合

這些視圖為 Map 的遍歷提供了基礎(chǔ)。

二、Map 遍歷的基礎(chǔ)方式

1. 使用 KeySet 迭代器遍歷

通過 keySet() 方法獲取鍵的集合,再遍歷鍵集合獲取對(duì)應(yīng)的值。

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

public class MapTraversalExample {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("apple", 1);
        map.put("banana", 2);
        map.put("cherry", 3);

        // 使用 KeySet 迭代器遍歷
        Iterator<String> keyIterator = map.keySet().iterator();
        while (keyIterator.hasNext()) {
            String key = keyIterator.next();
            Integer value = map.get(key);
            System.out.println("Key: " + key + ", Value: " + value);
        }
    }
}

優(yōu)點(diǎn):簡(jiǎn)單直接,適合僅需鍵或值的場(chǎng)景。
缺點(diǎn):每次通過鍵獲取值需要 O(1) 時(shí)間,效率略低。

2. 使用 KeySet 的 for-each 循環(huán)

Java 5 引入的 for-each 循環(huán)簡(jiǎn)化了集合的遍歷。

for (String key : map.keySet()) {
    Integer value = map.get(key);
    System.out.println("Key: " + key + ", Value: " + value);
}

優(yōu)點(diǎn):代碼更簡(jiǎn)潔。
缺點(diǎn):與迭代器方式一樣,需要兩次查找(一次在鍵集合,一次取值)。

三、EntrySet 遍歷:高效的鍵值對(duì)訪問

通過 entrySet() 方法獲取鍵值對(duì)集合,每個(gè)元素是一個(gè) Map.Entry<K, V> 對(duì)象。

1. EntrySet 迭代器遍歷

Iterator<Map.Entry<String, Integer>> entryIterator = map.entrySet().iterator();
while (entryIterator.hasNext()) {
    Map.Entry<String, Integer> entry = entryIterator.next();
    System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
}

2. EntrySet 的 for-each 循環(huán)

for (Map.Entry<String, Integer> entry : map.entrySet()) {
    System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
}

優(yōu)點(diǎn):

  • 一次獲取鍵值對(duì),效率更高(尤其在大數(shù)據(jù)量時(shí))。
  • 支持在遍歷中使用 iterator.remove() 刪除元素。

缺點(diǎn):

  • 代碼稍復(fù)雜(相對(duì) KeySet)。
  • 僅適用于需要同時(shí)訪問鍵和值的場(chǎng)景。

四、Java 8 引入的 Lambda 表達(dá)式與 Stream API

1. forEach() 方法結(jié)合 Lambda

Java 8 為 Map 接口新增了 forEach() 方法,結(jié)合 Lambda 表達(dá)式實(shí)現(xiàn)簡(jiǎn)潔的遍歷。

map.forEach((key, value) -> {
    System.out.println("Key: " + key + ", Value: " + value);
});

優(yōu)點(diǎn):

  • 代碼最簡(jiǎn)潔,可讀性高。
  • 支持并行處理(通過 parallelStream())。

缺點(diǎn):

  • 無法在遍歷中使用 remove() 方法刪除元素。
  • 不適用于需要復(fù)雜操作的場(chǎng)景。

2. Stream API 遍歷

通過 entrySet().stream() 獲取流,結(jié)合 Lambda 或方法引用處理元素。

// 順序流遍歷
map.entrySet().stream()
    .forEach(entry -> System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue()));

// 并行流遍歷(適用于大數(shù)據(jù)量和多核環(huán)境)
map.entrySet().parallelStream()
    .forEach(entry -> System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue()));

優(yōu)點(diǎn):

  • 支持過濾、映射等中間操作,靈活強(qiáng)大。
  • 并行流在多核環(huán)境下性能提升顯著。

缺點(diǎn):

  • 語法復(fù)雜度較高,適用于復(fù)雜數(shù)據(jù)處理場(chǎng)景。
  • 并行流可能引入線程安全問題(如使用非線程安全的 Map 實(shí)現(xiàn))。

五、Values 集合遍歷:僅訪問值

若只需遍歷值,可通過 values() 方法獲取值的集合。

// 使用 for-each 循環(huán)遍歷值
for (Integer value : map.values()) {
    System.out.println("Value: " + value);
}

// 使用 Stream API 遍歷值
map.values().stream()
    .forEach(value -> System.out.println("Value: " + value));

六、性能對(duì)比與最佳實(shí)踐

針對(duì)不同遍歷方式進(jìn)行性能測(cè)試(測(cè)試環(huán)境:JDK 17,100萬條數(shù)據(jù)):

遍歷方式操作耗時(shí)(毫秒)適用場(chǎng)景
KeySet 迭代器15僅需鍵或值,代碼兼容性要求高
KeySet for-each14僅需鍵或值,代碼簡(jiǎn)潔性優(yōu)先
EntrySet 迭代器8需鍵值對(duì),支持刪除操作
EntrySet for-each7需鍵值對(duì),代碼簡(jiǎn)潔
forEach + Lambda6需鍵值對(duì),代碼極簡(jiǎn)化
Stream API 順序流10需復(fù)雜數(shù)據(jù)處理
Stream API 并行流3大數(shù)據(jù)量,多核環(huán)境

最佳實(shí)踐建議:

  • 優(yōu)先使用 EntrySet:在需要同時(shí)訪問鍵和值的場(chǎng)景下,EntrySet 比 KeySet 更高效。
  • 推薦 Lambda 表達(dá)式:Java 8+ 環(huán)境下,forEach() 結(jié)合 Lambda 能顯著簡(jiǎn)化代碼。
  • 謹(jǐn)慎使用并行流:僅在大數(shù)據(jù)量且計(jì)算密集型任務(wù)中使用并行流,避免線程安全問題。
  • 考慮線程安全:在多線程環(huán)境下,使用 ConcurrentHashMap 并結(jié)合 forEach() 或 entrySet().iterator()。

七、線程安全的 Map 遍歷

在多線程環(huán)境中,使用 ConcurrentHashMap 時(shí)需注意遍歷的線程安全性。

import java.util.concurrent.ConcurrentHashMap;

public class ConcurrentMapTraversal {
    public static void main(String[] args) {
        ConcurrentHashMap<String, Integer> concurrentMap = new ConcurrentHashMap<>();
        concurrentMap.put("apple", 1);
        concurrentMap.put("banana", 2);
        concurrentMap.put("cherry", 3);

        // 線程安全的遍歷方式
        concurrentMap.forEach((key, value) -> {
            System.out.println("Key: " + key + ", Value: " + value);
        });
    }
}

注意:

  • ConcurrentHashMap 的迭代器具有弱一致性(Weakly Consistent),允許在迭代期間進(jìn)行并發(fā)修改。
  • 避免在迭代過程中使用傳統(tǒng)的 remove() 方法,應(yīng)使用 ConcurrentHashMap 提供的 remove(key) 或 computeIfPresent() 等原子方法。

總結(jié)

Java 中 Map 集合的遍歷方式豐富多樣,每種方式都有其適用場(chǎng)景。選擇合適的遍歷方式不僅能提高代碼的可讀性,還能優(yōu)化性能。以下是選擇遍歷方式的決策樹:

  • 是否只需值?

    • 是 → 使用 values().forEach() 或 values().stream()。
  • 是否需要同時(shí)訪問鍵和值?

    • 是 → 繼續(xù)。
    • 否 → 使用 keySet()。
  • 是否在 Java 8+ 環(huán)境且無需刪除元素?

    • 是 → 使用 forEach() + Lambda。
    • 否 → 繼續(xù)。
  • 是否需要在遍歷中刪除元素?

    • 是 → 使用 entrySet().iterator()。
    • 否 → 使用 entrySet().forEach()
  • 是否處理大數(shù)據(jù)量且在多核環(huán)境?

    • 是 → 考慮 entrySet().parallelStream()

到此這篇關(guān)于Java中Map集合遍歷的多種實(shí)現(xiàn)方式的文章就介紹到這了,更多相關(guān)Java Map集合遍歷內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • java判斷空的實(shí)現(xiàn)方法

    java判斷空的實(shí)現(xiàn)方法

    字符串判斷空有兩種情況:一個(gè)是分配了內(nèi)存但值為空(""),另一個(gè)是未分配內(nèi)存(null),判斷方法包括isEmpty()和isBlank(),其中isBlank()還可以過濾空格、制表符,對(duì)于列表,判斷不為空可以使用list!=null && !list.isEmpty()或list!=null && list.size()>0
    2024-09-09
  • kafka提交偏移量失敗導(dǎo)致重復(fù)消費(fèi)的解決

    kafka提交偏移量失敗導(dǎo)致重復(fù)消費(fèi)的解決

    文章主要討論了在使用Spring Kafka時(shí)遇到的`KafkaException`,特別是與消費(fèi)者組和偏移量提交相關(guān)的問題,文章解釋了Kafka消費(fèi)者的心跳機(jī)制和`max.poll.interval.ms`配置的作用,并提供了如何在`application.yml`或`application.properties`文件中配置這些參數(shù)的示例
    2026-01-01
  • Spring?Boot項(xiàng)目完美大一統(tǒng)(結(jié)果異常日志統(tǒng)一)

    Spring?Boot項(xiàng)目完美大一統(tǒng)(結(jié)果異常日志統(tǒng)一)

    這篇文章主要為大家介紹了Spring?Boot項(xiàng)目完美大一統(tǒng)(結(jié)果異常日志統(tǒng)一)的實(shí)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Springboot中登錄后關(guān)于cookie和session攔截問題的案例分析

    Springboot中登錄后關(guān)于cookie和session攔截問題的案例分析

    這篇文章主要介紹了Springboot中登錄后關(guān)于cookie和session攔截案例,本文通過實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • java.lang.IllegalStateException:方法有太多主體參數(shù)問題

    java.lang.IllegalStateException:方法有太多主體參數(shù)問題

    這篇文章主要介紹了java.lang.IllegalStateException:方法有太多主體參數(shù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • SpringBoot集成Flowable實(shí)現(xiàn)工作流解讀

    SpringBoot集成Flowable實(shí)現(xiàn)工作流解讀

    文章介紹如何通過Flowable與SpringBoot結(jié)合搭建企業(yè)審批系統(tǒng),涵蓋流程設(shè)計(jì)、引擎集成、業(yè)務(wù)交互及全生命周期管理,實(shí)現(xiàn)可視化建模、低代碼開發(fā),助力中小企業(yè)高效協(xié)作與數(shù)字化轉(zhuǎn)型
    2025-08-08
  • 使用jpa的時(shí)候set實(shí)體類屬性自動(dòng)持久化的解決方案

    使用jpa的時(shí)候set實(shí)體類屬性自動(dòng)持久化的解決方案

    這篇文章主要介紹了使用jpa的時(shí)候set實(shí)體類屬性自動(dòng)持久化的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Python基礎(chǔ)之如何使用multiprocessing模塊

    Python基礎(chǔ)之如何使用multiprocessing模塊

    今天帶大家學(xué)習(xí)python多進(jìn)程的相關(guān)知識(shí),文中對(duì)multiprocessing模塊的使用作了非常詳細(xì)的介紹,需要的朋友可以參考下
    2021-06-06
  • Mybatis-plus如何提前獲取實(shí)體類用雪花算法生成的ID

    Mybatis-plus如何提前獲取實(shí)體類用雪花算法生成的ID

    本文主要介紹了Mybatis-plus如何提前獲取實(shí)體類用雪花算法生成的ID,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • springboot網(wǎng)站應(yīng)用使用第三方qq登錄的實(shí)現(xiàn)過程

    springboot網(wǎng)站應(yīng)用使用第三方qq登錄的實(shí)現(xiàn)過程

    這篇文章主要介紹了springboot網(wǎng)站應(yīng)用使用第三方qq登錄,本文通過實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09

最新評(píng)論

石棉县| 南城县| 莱西市| 平顺县| 漳平市| 洞头县| 土默特左旗| 鸡泽县| 舟曲县| 通辽市| 香港 | 林芝县| 屯门区| 吉安市| 浦江县| 顺义区| 铜梁县| 晋城| 酉阳| 巴青县| 南江县| 资兴市| 石首市| 光山县| 长乐市| 三原县| 铜山县| 奉节县| 新闻| 六枝特区| 漳平市| 苍梧县| 大厂| 甘洛县| 库伦旗| 仙桃市| 黑龙江省| 甘孜| 阜平县| 四川省| 龙陵县|