当前位置: 首页 > news >正文

Java Map遍历方式

Map 核心结构

Map 存储键值对(Key-Value),遍历操作主要涉及三个核心集合:

  • map.keySet():获取所有 Key 的集合
  • map.values():获取所有 Value 的集合
  • map.entrySet():获取所有键值对(Entry)的集合

遍历方式详解

遍历 KeySet

Set<String>keySet=map.keySet();for(Stringkey:keySet){Stringvalue=map.get(key);System.out.println("Key: "+key+", Value: "+value);}

遍历 Values

for(Stringvalue:map.values()){System.out.println("Value: "+value);}

遍历 EntrySet

Set<Map.Entry<String,String>>entrySet=map.entrySet();for(Map.Entry<String,String>entry:entrySet){System.out.println("Key: "+entry.getKey()+", Value: "+entry.getValue());}

迭代器遍历 EntrySet

Iterator<Map.Entry<String,String>>iterator=entrySet.iterator();while(iterator.hasNext()){Map.Entry<String,String>entry=iterator.next();if("age".equals(entry.getKey())){iterator.remove();continue;}System.out.println("Key: "+entry.getKey()+", Value: "+entry.getValue());}

Lambda 遍历

map.forEach((key,value)->{System.out.println("Key: "+key+", Value: "+value);});

Stream 遍历

map.entrySet().stream().filter(entry->entry.getKey().contains("n")).forEach(entry->System.out.println("Key: "+entry.getKey()+", Value: "+entry.getValue()));

并行 Stream 遍历

map.entrySet().parallelStream().forEach(entry->System.out.println("Key: "+entry.getKey()+", Value: "+entry.getValue()));

性能与适用场景对比

遍历方式效率适用场景
遍历 KeySet少量数据、快速实现
遍历 Values只需要 Value 时
遍历 EntrySet大多数场景(推荐首选)
迭代器遍历 EntrySet需要遍历中删除元素
Lambda 遍历JDK8+、无需删除元素的场景
Stream 遍历需要对数据做复杂处理
并行 Stream 遍历极高百万级以上大数据量遍历

关键注意事项

效率优化

  • EntrySet 直接存储 Key-Value 映射,效率比 KeySet 高 50% 以上

元素删除安全

  • 增强 for 循环中删除会抛异常
  • 使用iterator.remove()removeIf()安全删除

线程安全

  • 非线程安全 Map 需加锁或使用 ConcurrentHashMap
  • 并行 Stream 可能导致结果无序

空指针防护

if(map!=null&&!map.isEmpty()){// 执行遍历逻辑}

性能测试数据

以 100 万条数据测试结果(单位:毫秒):

遍历方式耗时
KeySet85
EntrySet42
Lambda45
并行 Stream18

最佳实践建议

  • 日常开发优先使用 EntrySet
  • 需要删除元素时使用迭代器
  • JDK8+环境可选用 Lambda 表达式
  • 大数据量处理考虑并行 Stream
  • 线程安全场景使用 ConcurrentHashMap
http://www.jsqmd.com/news/525387/

相关文章:

  • RexUniNLU效果展示:多模态文档理解能力测评
  • Isaac Sim远程开发避坑指南:从TurboVNC配置到普通用户权限切换
  • OpenClaw硬件适配:Qwen3.5-9B在M1/M2芯片的优化运行方案
  • Node.js后端服务调用Nanbeige 4.1-3B AI能力:完整集成示例
  • LeetCode Hot 100 | 哈希表专题(C++ 题解)
  • 从零到一:小兔鲜电商项目全栈开发实战与架构演进
  • 快速上手Python GUI开发:PyCharm与Anaconda3集成PyQt5的完整配置流程
  • 软件测试自动化:Gemma-3-270m生成测试用例
  • Python离线环境终极方案:用虚拟机打包完整开发环境(附RHEL7.6/Python3.7实战)
  • FreeModbus——从零开始移植到STM32的实战指南
  • 循迹小车控制实验:代码集成与硬件验证
  • FreeRTOS延时函数vTaskDelay和xTaskDelayUntil,我该用哪个?一张图帮你彻底搞懂
  • Phi-3-mini-128k-instruct指令跟随能力展示:复杂多轮任务分解与执行
  • Leaflet矢量瓦片实战:PBF切片加载与交互优化
  • Java开发者快速上手Qwen3字幕SDK教程
  • Hadoop大数据可视化:Superset集成实战教程
  • AnimateDiff参数详解:从基础到高级的完整配置指南
  • Spring Boot 4 架构巨变解析(六):从「约定优于配置」到「编译期优先」
  • 基于 Spark 的毕业设计 PPT 效率提升实战:从数据处理到自动可视化
  • OpenClaw+Qwen3.5-9B组合教学:5个新手常见问题解答
  • Siamese网络实战:用Python手把手教你实现人脸相似度对比(附完整代码)
  • 计算机毕业设计 | SpringBoot招投标系统 任务发布网站(附源码)
  • Qwen3-32B效果实测:320亿参数模型,智能对话体验有多强?
  • MusePublic插件生态:支持ControlNet姿态控制的扩展方案
  • VideoAgentTrek-ScreenFilter企业应用:构建屏幕内容知识图谱的底层检测引擎
  • 全志T7 Display驱动开发实战:从零配置LCD时序到背光调试
  • 【华为OD机试真题】斗地主跑得快 · 最长顺子判定(C语言)
  • AI原生应用情境感知的未来展望
  • 悠哉字体:一款让中文排版更“悠然自得“的开源手写字体
  • 内容发表前必须改写吗?3年实测告诉你:AI率超标,再优质的内容也白搭