news 2026/3/13 7:54:46

Java 中遍历 HashMap 的多种方式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java 中遍历 HashMap 的多种方式

由于很久没有进行javase的语法学习,对于HashMap中的键值对操作有些不熟悉,使用ai帮我重温了一下,于是便有了这篇博客

📚 目录(点击跳转对应章节)

  • 一、最推荐:遍历entrySet(同时获取键 + 值,效率最高)
    • 1. 增强 for 循环(JDK 5+,简洁易读)
    • 2. 迭代器(JDK 5+,显式控制遍历流程)
  • 二、仅遍历键(keySet)或仅遍历值(values)
    • 1. 仅遍历键(keySet)
    • 2. 仅遍历值(values)
  • 三、JDK 8+ 简化写法:forEach 方法(Lambda 表达式)
    • 1. 同时遍历键 + 值(推荐)
    • 2. 仅遍历键/值(结合 Stream)
  • 四、各遍历方式对比(选型参考)
  • 五、注意事项
  • 总结

在 Java 中遍历哈希表(核心实现为HashMap)的键和值,有多种方式,适配不同的 JDK 版本和使用场景(如仅遍历键、仅遍历值、同时遍历键值对)。下面按常用程度 + 易用性排序,讲解每种遍历方式的写法、适用场景和注意事项。

核心前提

HashMap实现了Map接口,遍历的核心是利用Map提供的三类视图:

  • keySet():获取所有键的Set集合;
  • values():获取所有值的Collection集合;
  • entrySet():获取所有键值对(Map.Entry)的Set集合(最推荐的全量遍历方式)。

一、最推荐:遍历entrySet(同时获取键 + 值,效率最高)

entrySet()直接返回键值对的集合,只需一次遍历即可同时获取keyvalue,避免了“先遍历键,再通过get(key)查值”的二次哈希查找,效率最优,是全量遍历键值对的首选。

1. 增强 for 循环(JDK 5+,简洁易读)

importjava.util.HashMap;importjava.util.Map;publicclassMapTraversal{publicstaticvoidmain(String[]args){HashMap<String,Integer>scoreMap=newHashMap<>();scoreMap.put("张三",90);scoreMap.put("李四",85);scoreMap.put("王五",95);// 遍历 entrySet,同时获取 key 和 valuefor(Map.Entry<String,Integer>entry:scoreMap.entrySet()){Stringkey=entry.getKey();// 获取键Integervalue=entry.getValue();// 获取值System.out.println("键:"+key+",值:"+value);}}}

输出:

键:张三,值:90 键:李四,值:85 键:王五,值:95

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

若遍历过程中需要安全删除元素(避免ConcurrentModificationException),需用迭代器:

importjava.util.HashMap;importjava.util.Iterator;importjava.util.Map;publicclassMapTraversal{publicstaticvoidmain(String[]args){HashMap<String,Integer>scoreMap=newHashMap<>();scoreMap.put("张三",90);scoreMap.put("李四",85);scoreMap.put("王五",95);// 迭代器遍历 entrySetIterator<Map.Entry<String,Integer>>iterator=scoreMap.entrySet().iterator();while(iterator.hasNext()){Map.Entry<String,Integer>entry=iterator.next();Stringkey=entry.getKey();Integervalue=entry.getValue();// 示例:删除值 < 90 的键值对if(value<90){iterator.remove();// 安全删除continue;}System.out.println("键:"+key+",值:"+value);}System.out.println("删除后的哈希表:"+scoreMap);// {张三=90, 王五=95}}}

二、仅遍历键(keySet)或仅遍历值(values)

若只需单独处理键或值,无需同时获取,用keySet()values()更简洁。

1. 仅遍历键(keySet)

HashMap<String,Integer>scoreMap=newHashMap<>();scoreMap.put("张三",90);scoreMap.put("李四",85);// 增强 for 循环遍历键for(Stringkey:scoreMap.keySet()){System.out.println("键:"+key);}// 迭代器遍历键(支持删除)Iterator<String>keyIterator=scoreMap.keySet().iterator();while(keyIterator.hasNext()){Stringkey=keyIterator.next();if(key.equals("李四")){keyIterator.remove();// 删除键,对应的键值对也会被删除}}

2. 仅遍历值(values)

HashMap<String,Integer>scoreMap=newHashMap<>();scoreMap.put("张三",90);scoreMap.put("李四",85);// 增强 for 循环遍历值for(Integervalue:scoreMap.values()){System.out.println("值:"+value);}// 迭代器遍历值(注意:无法直接通过值删除键值对)Iterator<Integer>valueIterator=scoreMap.values().iterator();while(valueIterator.hasNext()){Integervalue=valueIterator.next();if(value==85){// 错误示例:valueIterator.remove() 会导致异常或不一致// 正确做法:建议改用 entrySet 迭代器通过键删除}}

三、JDK 8+ 简化写法:forEach 方法(Lambda 表达式)

JDK 8 新增的forEach方法(Map接口默认方法),用 Lambda 表达式简化遍历,代码最简洁

1. 同时遍历键 + 值(推荐)

HashMap<String,Integer>scoreMap=newHashMap<>();scoreMap.put("张三",90);scoreMap.put("李四",85);// forEach + Lambda 遍历键值对scoreMap.forEach((key,value)->{System.out.println("键:"+key+",值:"+value);// 支持修改值(需重新 put)if(key.equals("张三")){scoreMap.put(key,value+5);// 张三的分数改为 95}});System.out.println("修改后的哈希表:"+scoreMap);// {张三=95, 李四=85}

2. 仅遍历键/值(结合 Stream)

// 仅遍历键(stream 过滤)scoreMap.keySet().stream().filter(key->key.startsWith("张")).forEach(key->System.out.println("过滤后的键:"+key));// 仅遍历值(stream 求和)inttotalScore=scoreMap.values().stream().mapToInt(Integer::intValue).sum();System.out.println("总分:"+totalScore);// 示例:180

四、各遍历方式对比(选型参考)

遍历方式适用场景效率支持删除JDK 版本
entrySet(增强 for)同时遍历键+值,无需删除最高不支持5+
entrySet(迭代器)同时遍历键+值,需删除元素最高支持1.2+
keySet仅遍历键,或通过键查值较低(二次哈希)支持1.2+
values仅遍历值中等不推荐1.2+
forEach(Lambda)简洁遍历,无需复杂逻辑同 entrySet不支持(需手动 put/remove)8+

五、注意事项

  1. 无序性HashMap遍历顺序不保证与插入顺序一致,若需保留插入顺序,使用LinkedHashMap(遍历方式完全相同);
  2. 线程安全:非线程安全的HashMap在多线程遍历/修改时,需加锁(如synchronized)或使用ConcurrentHashMap
  3. 禁止遍历中修改:增强 for 循环遍历中直接put/remove会抛出ConcurrentModificationException,需用迭代器或ConcurrentHashMap
  4. 自定义对象作为键:若键是自定义对象,需重写hashCode()equals(),否则遍历可能出现异常(如重复键)。

总结

  • 优先选entrySet(增强 for / 迭代器)→ 效率最高,支持同时获取键值对;
  • JDK 8+ 首选forEach(Lambda)→ 代码最简洁;
  • 仅需键/值keySet()/values()→ 简化代码;
  • 需删除元素entrySet迭代器 → 安全无异常。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/13 0:48:35

大模型落地全攻略:从技术实践到企业价值创造

大模型落地已从概念验证阶段进入规模化应用的深水区。企业在实际部署中常面临三大核心挑战&#xff1a;如何平衡模型性能与成本、如何适配行业知识与业务流程、如何实现安全可控的规模化应用。本文系统拆解大模型落地的四大关键技术路径——微调&#xff08;Fine-tuning&#x…

作者头像 李华
网站建设 2026/3/12 23:03:11

基于C++实现(控制台)自助点餐系统

自助点餐系统题目设计一个自助点餐系统&#xff0c;方便顾客自己点餐&#xff0c;并提供对餐厅销售情况的统计和管理功能。业务流程图图一&#xff1a;管理员界面操作流程图图二&#xff1a;顾客点菜界面系统功能结构图类的设计程序代码与说明头文件1.SystemMap.h#pragma once …

作者头像 李华
网站建设 2026/3/13 0:17:58

React图标完全指南:从零开始打造专业级SVG图标系统

React图标完全指南&#xff1a;从零开始打造专业级SVG图标系统 【免费下载链接】react-icons svg react icons of popular icon packs 项目地址: https://gitcode.com/gh_mirrors/re/react-icons React图标库是现代React项目中最优雅的SVG图标解决方案&#xff0c;通过E…

作者头像 李华
网站建设 2026/3/12 23:03:12

如何快速构建优雅的桌面应用:PyQt-SiliconUI框架详解

如何快速构建优雅的桌面应用&#xff1a;PyQt-SiliconUI框架详解 【免费下载链接】PyQt-SiliconUI A powerful and artistic UI library based on PyQt5 / PySide6&#xff0c;基于PyQt5 / PySide6的UI框架&#xff0c;灵动、优雅而轻便 项目地址: https://gitcode.com/gh_mi…

作者头像 李华