0

0

如何遍历Java中的Map集合_四种常用的遍历方式总结

P粉602998670

P粉602998670

发布时间:2026-03-18 09:54:31

|

769人浏览过

|

来源于php中文网

原创

entrySet()遍历最常用最安全,能同时获取key和value、避免重复查表;keySet()适合仅需key或value较大时;values()适用于只处理value;需删除元素时必须用Iterator.remove()。

如何遍历java中的map集合_四种常用的遍历方式总结

entrySet() 遍历最常用也最安全

绝大多数场景下,直接遍历 entrySet() 是首选——它同时拿到 key 和 value,避免了重复查表,性能好,语义也清楚。

常见错误是写成 map.keySet().forEach(key -> map.get(key)):看似简洁,但对 HashMap 还好,换成 TreeMap 或自定义 Map 实现时,get() 可能有额外开销;更严重的是,如果遍历时有其他线程修改了 map(比如删掉当前 key),get() 可能返回 null 或抛 ConcurrentModificationException(取决于具体实现)。

实操建议:

  • for (Map.Entry<k v> entry : map.entrySet())</k> 显式迭代,控制力强,兼容所有 JDK 版本
  • Java 8+ 可用 map.entrySet().forEach(entry -> { ... }),但注意 lambda 内部不能修改 map 结构
  • 别在循环体里调用 entry.setValue(...) 以外的修改操作(如 map.remove(entry.getKey())),会破坏迭代器状态

keySet() 遍历只取 key 或只需 key 查 value

当你明确只需要 key,或者 key 足够轻量、value 很大且不总要访问时,keySet() 更省内存——它返回的是 key 的视图,不打包 value。

立即学习Java免费学习笔记(深入)”;

但要注意:每次用 map.get(key) 都是一次哈希查找。如果 value 是复杂对象,又频繁访问,不如直接用 entrySet() 一次取全。

典型误用:

Ai好记
Ai好记

强大的AI音视频转录与总结工具

下载
  • 在 for-each 循环里反复写 if (map.get(k) != null && map.get(k).equals("xxx")) —— get() 被调了两次
  • 遍历 keySet() 同时又调用 map.remove(key):多数 Map 实现不支持边遍历边删 key(ConcurrentHashMap 除外),会抛异常

values() 遍历只关心 value 本身

当完全不需要 key,只做统计、过滤或批量处理 value 时,values() 最直白。它返回的是 value 的集合视图,修改它可能间接影响原 map(比如 HashMap.values()remove() 会删对应 key)。

容易踩的坑:

  • values() 不保证顺序,哪怕原 map 是 LinkedHashMap,它的 values() 也是按插入顺序,但代码里看不出这个隐含依赖,可读性差
  • ConcurrentHashMapvalues() 返回的是弱一致快照,遍历时其他线程的更新可能不可见
  • 别假设 values() 可以转成数组后安全修改——比如 map.values().toArray()[0] = new Object(),这不会影响 map,只是改了副本

用迭代器手动遍历(Iterator)应对删除需求

唯一安全地在遍历中删除元素的方式,是用 Iteratorremove() 方法。用 for-each 或增强 for 循环调 map.remove() 必崩。

示例场景:清理过期缓存项。

Iterator<Map.Entry<String, CacheItem>> it = map.entrySet().iterator();
while (it.hasNext()) {
    Map.Entry<String, CacheItem> entry = it.next();
    if (entry.getValue().isExpired()) {
        it.remove(); // 安全,底层调用的是 map 的 remove
    }
}

关键点:

  • it.remove() 只能调一次,连续调两次会抛 IllegalStateException
  • 不能在迭代器外调 map.remove(),否则下一次 it.next() 极大概率抛 ConcurrentModificationException
  • ConcurrentHashMap 的迭代器允许并发修改,但它的 remove() 行为和普通 HashMap 不同(比如不保证立即从所有线程可见),这点常被忽略
遍历 Map 看似简单,但 key/value 的耦合性、迭代器的生命周期、并发安全性这三点,稍不注意就会在压测或上线后暴露。尤其别把「能跑通」当成「正确」——很多 bug 只在特定数据量、特定 map 实现、特定并发节奏下才触发。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

256

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1154

2024.03.01

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

848

2023.08.22

php中foreach用法
php中foreach用法

本专题整合了php中foreach用法的相关介绍,阅读专题下面的文章了解更多详细教程。

288

2025.12.04

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

215

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

193

2025.11.08

Python lambda详解
Python lambda详解

本专题整合了Python lambda函数相关教程,阅读下面的文章了解更多详细内容。

62

2026.01.05

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

806

2023.08.10

抖漫入口地址合集
抖漫入口地址合集

本专题整合了抖漫入口地址相关合集,阅读专题下面的文章了解更多详细地址。

17

2026.03.17

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.5万人学习

C# 教程
C# 教程

共94课时 | 11.5万人学习

Java 教程
Java 教程

共578课时 | 83.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号