跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava算法

Java 遍历 Map 的常用方式与性能对比

Java 遍历 Map 支持 keySet、values、entrySet、Iterator 及 Lambda 等多种方式。仅访问单一字段可选用前者;同时获取键值推荐 entrySet,效率高于 keySet+get。遍历时若涉及修改集合,Iterator 是唯一安全选项。Lambda 虽简洁但性能稍逊。实测表明数据规模与类型会影响耗时,实际开发应根据场景权衡选择。

极客零度发布于 2019/3/10更新于 2026/10/1797 浏览
Java 遍历 Map 的常用方式与性能对比

Java 遍历 Map 的常用方式与性能对比

在 Java 开发中,Map 是数据结构的核心组件之一。从早期的 Iterator 到 Java 5 引入的 foreach,再到 Java 8 的 Lambda 表达式,遍历方式不断演进。作为开发者,了解每种方式的适用场景和性能差异至关重要。

首先,我们需要一个基础的数据结构来演示。这里定义一个静态 Map 用于后续测试:

public class TestMap {
    public static Map<Integer, Integer> map = new HashMap<>();
    
    static {
        for (int i = 0; i < 100000; i++) {
            map.put(i, 1);
        }
    }
}

1. 仅获取 Key 或 Value

如果业务逻辑只需要单独处理键或值,直接调用 keySet() 或 values() 是最直观的选择。

// 遍历 Key
for (Integer key : map.keySet()) {
    System.out.println(key);
}

// 遍历 Value
for (Integer value : map.values()) {
    System.out.println(value);
}

2. 同时获取 Key 和 Value

这是最常见的场景。虽然可以通过 keySet() 配合 get(key) 实现,但这并非最优解,因为每次 get 操作都涉及哈希查找,整体复杂度较高。

推荐使用 entrySet(),它直接返回键值对的视图,性能更稳定:

for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
    System.out.println(entry.getKey() + ":" + entry.getValue());
}

3. 遍历时修改集合

foreach 循环在遍历过程中修改 Map 大小(如添加或删除)会抛出 ConcurrentModificationException。此时 Iterator 是更安全的选择,它提供了安全的 remove() 方法:

Iterator<Map.Entry<Integer, Integer>> it = map.entrySet().iterator();
while (it.hasNext()) {
    Map.Entry<Integer, Integer> entry = it.next();
    
}
// it.remove(); // 安全删除元素

4. Lambda 表达式

Java 8 引入了 forEach 方法,语法极其简洁,适合快速迭代:

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

不过实测表明,Lambda 的性能通常略低于传统的 entrySet 方式,因此在追求极致性能的场景下需谨慎使用。

5. 性能实测

为了验证理论,我们使用 10 万条 Integer 数据进行测试,数据类型为 Integer,Map 实现选取 HashMap。结果如下:

方式耗时
KeySet392
Values320
keySet + get552
entrySet465
entrySet Iterator508
Lambda536

需要说明的是,Map 存储的数据类型、大小以及具体实现方式都会影响遍历性能,上述结果仅供参考。

总结建议

  • 仅获取 Key 或 Value:推荐使用 keySet() 或 values()。
  • 同时获取 Key 和 Value:强烈推荐 entrySet(),综合性能最佳。
  • 遍历时删除元素:请使用 Iterator,避免并发修改异常。
  • 遍历时增加元素:建议新建临时 Map 存放新增项,遍历结束后合并。
  • 追求代码简洁:可使用 Lambda,但需知晓其性能损耗。

目录

  1. Java 遍历 Map 的常用方式与性能对比
  2. 1. 仅获取 Key 或 Value
  3. 2. 同时获取 Key 和 Value
  4. 3. 遍历时修改集合
  5. 4. Lambda 表达式
  6. 5. 性能实测
  7. 总结建议

更多推荐文章

查看全部
  • 8款免费AI PPT生成工具评测
  • Transformer 20 个常见面试问题解析:从基础到高级
  • Ubuntu 22.04 下 libwebkit2gtk-4.1-0 安装与避坑指南
  • MacOS OpenClaw 安装指南及常见问题解决方案
  • 基于 Java Swing 的个人所得税计算模拟器源码解析
  • 前端微前端:大型应用的模块化解决方案
  • Spring Boot 结合 Leaflet 实现省级旅游口号 WebGIS 可视化
  • 基于 MCP Server - Figma AI Bridge 自动生成前端代码
  • 基于 DJL 与 PaddlePaddle 的菜品图像识别实现
  • Lostlife2.0 整合 LLama-Factory 引擎重塑 NPC 对话逻辑
  • Java API 详解:基础爬虫构建与带条件数据提取
  • 如何在 Windows 本地部署开源大语言模型:基于 Ollama 与 Open WebUI
  • AI 大模型 RAG 技术原理与实战应用
  • 知网 AIGC 检测原理与降低疑似度的实战策略
  • Gemma-3-12B-IT 强化学习对齐与 RLHF 训练流程解析
  • 使用 OpenCore Legacy Patcher 升级老旧 Mac 系统指南
  • VS Code 配置 C/C++ 编译与运行指南
  • 城市场景下无人机三维路径规划的多目标粒子群优化算法 NMOPSO
  • Gemini 图片无损去水印:基于数学算法的纯前端方案
  • 多模态模型开发实战:文本、图像与语音的融合应用

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online