Java Map遍历的“优雅”合集

提起Java中Map的遍历,很多人第一反应还是: for (Map.Entry<K,V> entry : map.entrySet()) 。但其实Map遍历藏着多种玩法,有的优雅简洁,有的性能拉满,今天咱们盘一盘这些进阶偏基础的遍历方式,告别重复又臃肿的代码~

一、先搞懂:Map遍历的核心目标

遍历Map本质是获取「键(Key)」、「值(Value)」或「键值对(Entry)」,不同场景对应不同遍历方式,先上基础准备代码:

java 复制代码
import java.util.HashMap;
import java.util.Map;

public class MapTraversalDemo {
    public static void main(String[] args) {
        Map<String, Integer> fruitPrice = new HashMap<>();
        fruitPrice.put("苹果", 10);
        fruitPrice.put("香蕉", 5);
        fruitPrice.put("橙子", 8);
        
        // 各种遍历方式写在这里~
    }
}

二、几种遍历方式的对比

1. 传统EntrySet遍历(最通用)

这是最基础也最常用的方式,支持同时获取键和值,兼容所有Java版本:

java 复制代码
// 方式1:普通for循环+EntrySet
for (Map.Entry<String, Integer> entry : fruitPrice.entrySet()) {
    String key = entry.getKey();
    Integer value = entry.getValue();
    System.out.println(key + ":" + value + "元");
}
 

2. Lambda表达式遍历(Java 8+,极简)

Java 8引入的forEach+Lambda,一行代码搞定,告别冗余:

java 复制代码
// 方式2:Lambda+forEach
fruitPrice.forEach((key, value) -> System.out.println(key + ":" + value + "元"));

3. 只遍历Key/Value(按需选择)

如果只需要键或值,不用遍历EntrySet,直接针对性获取:

java 复制代码
// 只遍历Key
for (String key : fruitPrice.keySet()) {
    System.out.println("水果:" + key);
}

// 只遍历Value
for (Integer value : fruitPrice.values()) {
    System.out.println("价格:" + value + "元");
}

4. 迭代器遍历(支持删除元素)

如果遍历过程中需要删除元素,迭代器是安全选择(foreach遍历删除会抛异常):

java 复制代码
// 方式4:迭代器遍历(支持删除)
Iterator<Map.Entry<String, Integer>> iterator = fruitPrice.entrySet().iterator();
while (iterator.hasNext()) {
    Map.Entry<String, Integer> entry = iterator.next();
    if (entry.getValue() < 8) {
        iterator.remove(); // 安全删除价格低于8的水果
    }
}
System.out.println("删除后的Map:" + fruitPrice);

三、避坑提醒

  1. 遍历过程中修改Map(如put/remove):除了迭代器的remove方法,其他方式可能触发 ConcurrentModificationException ;

  2. 性能优先级:EntrySet遍历 > 分别遍历Key+getValue(后者会重复查询Map);

  3. Lambda遍历虽然简洁,但无法在内部使用break/continue终止遍历。

相关推荐
WebInfra2 小时前
Rsdoctor 2.0 发布:Agent 驱动的全自动优化工具
前端·javascript·node.js
乘风gg2 小时前
AI Coding 时代最值钱的东西,软件工程(上)
前端·ai编程·claude
IT_陈寒2 小时前
一文搞懂Vite的核心概念
前端·人工智能·后端
data analyse 4562 小时前
前端白屏问题按路由和资源加载顺序定位
大数据·前端·人工智能·数据分析·html
倔强的石头1062 小时前
【Linux指南】进程通信系列(二):匿名管道 —— pipe 的本质、fork 继承与四种读写规则
java·linux·运维
调试优选官3 小时前
2026年IoT物联网开发赛道年度榜单深度解析:D-coding物联网系统定制与源码交付能力专项解读
java·物联网·struts·iot·开发经验
木井巳3 小时前
【动态规划】三步问题
java·算法·leetcode·动态规划·推荐算法
小张成长计划..3 小时前
【Linux】25:线程概念和控制
java·linux·jvm
mldong3 小时前
推荐一款支持AI的数据可视化一站式报表平台
前端·人工智能
风骏时光牛马3 小时前
AI开源工具一站式体验:上手探索原生AI能力
前端