Java里Map遍历有哪些常见方式_Java键值遍历技巧说明
发布时间 - 2026-01-12 00:00:00 点击率:次最推荐使用 for (Map.Entry entry : map.entrySet()) 遍历,兼顾可读性、性能(避免重复哈希查找)和兼容性(Java 5+),但需判空、写全泛型、禁止遍历时结构修改。
最常用、最推荐的方式是 for (Map.Entry —— 它兼顾可读性、性能和 JDK 兼容性(Java 5+),且不会额外触发 map.get() 查找。
用 entrySet() 遍历键值对(推荐首选)
这是绝大多数场景下的最优解:一次获取键和值,避免重复哈希查找。底层直接访问内部 Node 数组,不调用 get(),性能比 keySet() + get() 高约 10%~15%,尤其在大 Map 中更明显。
- 必须检查空引用:
if (map != null && !map.isEmpty()),否则map.entrySet()在 null 上会抛NullPointerException - 泛型务必写全,如
Map.Entry,避免运行时类型擦除导致的ClassCastException - 不要在遍历中修改 Map 结构(如
put()、remove()),否则会触发ConcurrentModificationException;如需删除,请用Iterator.remove()
Mapmap = new HashMap<>(); map.put("a", 1); map.put("b", 2); for (Map.Entry
entry : map.entrySet()) { System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue()); }
只遍历 key 或 value 时用 keySet() 和 values()
当你明确只需要键或只处理值(比如统计所有分数、收集所有用户名),用 keySet() 或 values() 更简洁、稍快,且语义更清晰。
-
keySet()遍历时若还需 value,**必须调用map.get(key)** —— 这会多一次哈希计算和可能的链表/红黑树遍历,小 Map 不明显,但万级数据下可观测到延迟上升 -
values()返回的是Collection,不保证顺序(除非用LinkedHashMap),也不能反查 key - 二者都不支持修改原 Map(如
remove()会抛UnsupportedOperationException),想安全删元素请回到entrySet().iterator()
// 只要 key
for (String key : map.keySet()) {
System.out.println("Key: " + key);
}
// 只要 value
for (Integer value : map.values()) {
System.out.println("Value: " + value);
}
需要控制遍历流程或兼容老 JDK 时用 Iterator
当你要在遍历中途 break、continue,或需在 Android(旧版 ART)、Java 6/7 环境下运行,Iterator 是唯一可控、兼容性最强的方式。它也允许安全删除元素。
- 务必用
entrySet().iterator(),而不是keySet().iterator()再去get()—— 后者仍是两趟操作 - 删除必须调用
iterator.remove(),不能调用map.remove(),否则立刻抛异常 - 泛型不写(裸类型)虽能跑,但极易引发类型错误,不建议在现代项目中使用
Iterator> it = map.entrySet().iterator(); while (it.hasNext()) { Map.Entry entry = it.next(); if (entry.getValue() > 1) { it.remove(); // 安全删除 } }
Java 8+ 场景:用 forEach() 或 stream() 做函数式处理
适合做过滤、映射、聚合等声明式操作,代码更紧凑,但要注意:它不是“更快”,而是“更表达意图”。实际性能略低于传统 for 循环(有 Lambda 创建开销、Stream pipeline 构建成本)。
-
forEach()是终端操作,不可链式继续;stream()可组
合 filter()、map()、collect(),但注意parallelStream()对 Map 遍历无意义(HashMap 本身无序且非分段) - 所有 Stream 操作默认不保证顺序(
HashMap无序),如需有序请用LinkedHashMap或显式sorted() - 别在
forEach()里修改外部变量(非 final 或 effectively final),编译会报错
map.forEach((key, value) -> {
System.out.println("Key: " + key + ", Value: " + value);
});
// 过滤出 value > 1 的项并转成 list
List> filtered = map.entrySet().stream()
.filter(entry -> entry.getValue() > 1)
.collect(Collectors.toList());
真正容易被忽略的点是:遍历前是否判空、遍历中是否误删结构、以及不同方式对 Map 实现类(如 TreeMap vs HashMap)的顺序影响——entrySet() 和 keySet() 在 TreeMap 中天然有序,在 HashMap 中则完全无序,这点不看文档很容易踩坑。
# java
# android
# node
# stream
# 键值对
# red
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel怎么生成URL_Laravel路由命名与URL生成函数详解
Laravel如何实现API版本控制_Laravel API版本化路由设计策略
网站制作报价单模板图片,小松挖机官方网站报价?
Python进程池调度策略_任务分发说明【指导】
Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复
如何在Windows环境下新建FTP站点并设置权限?
Laravel storage目录权限问题_Laravel文件写入权限设置
linux写shell需要注意的问题(必看)
如何生成腾讯云建站专用兑换码?
教你用AI润色文章,让你的文字表达更专业
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
如何快速查询域名建站关键信息?
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
Linux后台任务运行方法_nohup与&使用技巧【技巧】
edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】
如何在宝塔面板中创建新站点?
西安专业网站制作公司有哪些,陕西省建行官方网站?
北京专业网站制作设计师招聘,北京白云观官方网站?
canvas 画布在主流浏览器中的尺寸限制详细介绍
如何在阿里云ECS服务器部署织梦CMS网站?
实例解析angularjs的filter过滤器
标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南
Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面
微信小程序 wx.uploadFile无法上传解决办法
详解Oracle修改字段类型方法总结
如何安全更换建站之星模板并保留数据?
高端云建站费用究竟需要多少预算?
如何用IIS7快速搭建并优化网站站点?
Laravel如何使用Service Container和依赖注入?(代码示例)
JavaScript Ajax实现异步通信
Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能
Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解
Laravel如何实现文件上传和存储?(本地与S3配置)
Swift中swift中的switch 语句
如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)
Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】
JavaScript如何实现音频处理_Web Audio API如何工作?
如何在云主机上快速搭建网站?
猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】
如何快速辨别茅台真假?关键步骤解析
html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】
php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】
Laravel如何集成Inertia.js与Vue/React?(安装配置)
Laravel安装步骤详细教程_Laravel环境搭建指南
微信推文制作网站有哪些,怎么做微信推文,急?
Laravel如何实现全文搜索功能?(Scout和Algolia示例)
HTML 中动态设置元素 name 属性的正确语法详解
Laravel Session怎么存储_Laravel Session驱动配置详解


合