Java里Map遍历有哪些常见方式_Java键值遍历技巧说明

发布时间 - 2026-01-12 00:00:00    点击率:
最推荐使用 for (Map.Entry entry : map.entrySet()) 遍历,兼顾可读性、性能(避免重复哈希查找)和兼容性(Java 5+),但需判空、写全泛型、禁止遍历时结构修改。

最常用、最推荐的方式是 for (Map.Entry entry : map.entrySet()) —— 它兼顾可读性、性能和 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()
Map map = 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驱动配置详解