高效遍历 Map:优先使用 entrySet 或 JDK 8 的 forEach

简介: 在Java开发中,遍历Map时推荐使用`entrySet()`或JDK 8的`forEach()`,避免通过`keySet()`重复查找值。前者直接获取键值对,效率更高;后者结合Lambda,代码更简洁。根据场景选择合适方式,提升性能与可读性。


在 Java 开发中,遍历 Map 是常见操作,但不同的遍历方式在性能和可读性上存在显著差异。推荐优先使用 entrySet() 或 JDK 8 引入的 Map.forEach() 方法,而非通过 keySet() 间接获取值。

为什么 entrySet() 更高效?

使用 keySet() 遍历时,代码通常如下:

for (String key : map.keySet()) {
    String value = map.get(key); // 再次哈希查找
}

这种方式实际上进行了两次操作

  1. 遍历所有 key(通过 keySet().iterator());
  2. 对每个 key 调用 map.get(key),再次执行哈希计算和桶查找。

entrySet() 一次性将键值对封装为 Map.Entry 对象:

for (Map.Entry<String, String> entry : map.entrySet()) {
    String key = entry.getKey();
    String value = entry.getValue(); // 直接获取,无额外查找
}

无需二次哈希查找,效率更高,尤其在数据量大时优势明显。

JDK 8 的更优选择:forEach

Java 8 起,Map 接口提供了 forEach 方法,结合 Lambda 表达式,代码更简洁且性能优异:

map.forEach((key, value) -> {
    // 直接处理 key 和 value
});

该方法内部基于 entrySet 实现,避免了显式迭代器开销,同时具备良好的可读性和函数式风格。

补充说明

  • keySet():返回 Set<K>,适合仅需 key 的场景;
  • values():返回 Collection<V>,适合仅需 value 的场景;
  • entrySet():返回 Set<Map.Entry<K, V>>最适合需要同时访问 key 和 value 的情况

总结

场景 推荐方式
同时使用 key 和 value entrySet()map.forEach()
仅使用 key keySet()
仅使用 value values()

避免在需要 KV 对时使用 keySet() + get() 组合,这不仅低效,还违背了性能优化的基本原则。在现代 Java 开发中,善用 entrySetforEach,是写出高效、简洁代码的重要实践。


相关文章
|
5月前
|
机器学习/深度学习 存储 自然语言处理
大模型基础概念术语解释
大语言模型(LLM)基于Transformer架构,通过海量文本训练,具备强大语言理解与生成能力。其核心组件包括注意力机制、位置编码与嵌入层,支持文本分割为Token进行处理。参数量达亿级以上,规模增长带来涌现能力,如复杂推理与跨任务泛化。混合专家模型(MoE)提升效率,推动模型持续扩展。
|
5月前
|
负载均衡 算法 Java
5-微服务篇
本文详解SpringBoot自动装配原理、启动流程、核心注解@SpringBootApplication组成,以及常用起步依赖、配置文件加载顺序。涵盖SpringBoot运行方式、跨域解决方案,结合SpringCloud介绍五大组件、微服务通信、注册发现、负载均衡策略及自定义方法。同时分享项目中限流、熔断、降级、异常处理等实战经验,全面解析微服务架构关键技术实现。
229 0
|
测试技术 API Python
Python中requests、aiohttp、httpx性能对比
这篇文章对比了Python中三个流行的HTTP客户端库:requests、aiohttp和httpx,在发送HTTP请求时的性能,并提供了测试代码和结果,以帮助选择适合不同应用场景的库。
1702 2
|
机器学习/深度学习 Python
在Python中监听变量值的变化
在Python中监听变量值的变化
1372 2
|
运维 监控 安全
什么是API?
API全称Application Programming Interface,即应用程序编程接口,是一些预先定义的函数,或指软件系统不同组成部分衔接的约定,用于传输数据和指令,使应用程序之间可以集成和共享数据资源。
2550 10
|
移动开发 前端开发 API
uniapp实现条码扫描 可开闪光灯,原生H5调用,不需要任何sdk。
一维码识别功能使用的是Quagga这个库。调用摄像头使用的 navigator.mediaDevices.getUserMedia 这个H5的api。通过 video 和 canvas 把摄像头获取到的数据展现到页面上,同时调用监听Quagga解析。
1760 0
|
JavaScript 前端开发 API
一个非常 nb 的 Vue 组件 (含Vue3版本)
一个非常 nb 的 Vue 组件 (含Vue3版本)
|
easyexcel Java 关系型数据库
厉害了!12秒将百万数据通过EasyExcel导入MySQL数据库中
【5月更文挑战第12天】厉害了!12秒将百万数据通过EasyExcel导入MySQL数据库中
701 1
|
大数据 关系型数据库 MySQL
MYSQL中group_concat有长度限制!默认1024(转载)
在mysql中,有个函数叫“group_concat”,平常使用可能发现不了问题,在处理大数据的时候,会发现内容被截取了,其实MYSQL内部对这个是有设置的,默认不设置的长度是1024,如果我们需要更大,就需要手工去修改配置文件。
5767 0

热门文章

最新文章