java Map 遍历 详解

在 Java 中,Map 是一种键值对(Key-Value)形式存储数据的集合接口。遍历 Map 是日常开发中的常见需求。以下是遍历 Map 的详解,包括各种常见方式及其适用场景。


1. Map 的基本结构

在 Java 中,Map 提供了以下几种常用实现类:

  • HashMap:基于哈希表实现,元素无序,查找和插入操作效率高。
  • LinkedHashMap:有序版本的 HashMap,按插入顺序或访问顺序存储。
  • TreeMap:基于红黑树实现,按键的自然顺序或指定的比较器顺序存储。
  • ConcurrentHashMap:线程安全的哈希表实现,适用于多线程环境。

2. Map 遍历的常见方法

2.1 遍历键值对 (Key-Value Pairs)

通过 entrySet() 方法,可以获取 Map 中的键值对集合。每个键值对封装在一个 Map.Entry 对象中。

方式 1:使用 for-each 循环
import java.util.HashMap;
import java.util.Map;public class MapIteration {public static void main(String[] args) {Map<String, Integer> map = new HashMap<>();map.put("Alice", 25);map.put("Bob", 30);map.put("Charlie", 35);// 遍历键值对for (Map.Entry<String, Integer> entry : map.entrySet()) {String key = entry.getKey();Integer value = entry.getValue();System.out.println(key + " = " + value);}}
}
优点:
  • 语法清晰,便于理解。
  • 最常用的方式。
输出:
Alice = 25
Bob = 30
Charlie = 35

2.2 遍历键 (Keys)

通过 keySet() 方法获取所有键的集合,然后根据键获取对应的值。

代码实现:
for (String key : map.keySet()) {Integer value = map.get(key);System.out.println(key + " = " + value);
}
优点:
  • 适用于仅对键进行操作的场景。
缺点:
  • 每次通过 map.get(key) 获取值时,可能有额外的查找开销(尤其是 HashMap)。

2.3 遍历值 (Values)

通过 values() 方法获取所有值的集合,仅用于需要操作值的场景。

代码实现:
for (Integer value : map.values()) {System.out.println("Value = " + value);
}
优点:
  • 直接访问值,适用于只关注值的情况。
缺点:
  • 无法获取键。

2.4 使用 Java 8 的 Stream API

Stream API 提供了更加简洁、函数式风格的遍历方式,适合在 Java 8 及以上版本中使用。

代码实现:
map.forEach((key, value) -> System.out.println(key + " = " + value));
优点:
  • 简洁高效,函数式表达更现代化。
  • 避免了显式循环代码。

2.5 遍历时修改 Map

在遍历的同时修改 Map 是一个比较特殊的需求,需要特别注意。

  • 对于普通的 HashMap,直接修改会抛出 ConcurrentModificationException
  • 可以使用 IteratorConcurrentHashMap
代码实现:
Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {Map.Entry<String, Integer> entry = iterator.next();if (entry.getValue() < 30) {iterator.remove(); // 删除值小于30的键值对}
}
适用场景:
  • 遍历过程中需要删除或修改键值对。

3. Map 遍历方式的比较

遍历方式代码简洁性效率适用场景
entrySet() + for-each中等高效同时需要键和值的场景
keySet() + get()简单较低(有查找开销)仅需要操作键,偶尔需要获取值的场景
values() + for-each简单高效只需要操作值的场景
forEach (Stream API)简洁高效Java 8+ 环境,推荐现代化开发
Iterator较复杂中等遍历过程中需要安全删除或修改键值对的场景

4. 适配不同场景的遍历方式

4.1 同时操作键和值

最常用的场景是需要同时操作 Map 的键和值,例如打印所有键值对或对键值对进行某些操作。

  • 推荐使用 entrySet()forEach
示例:
map.forEach((key, value) -> System.out.println(key + " = " + value));

4.2 仅需要操作键

当只需要操作键时,可以直接使用 keySet()

示例:
for (String key : map.keySet()) {System.out.println("Key = " + key);
}

4.3 仅需要操作值

当只需要操作值时,可以直接使用 values()

示例:
for (Integer value : map.values()) {System.out.println("Value = " + value);
}

4.4 遍历时修改 Map

当需要在遍历的同时删除或修改键值对时,使用 Iterator 是首选。

示例:
Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {Map.Entry<String, Integer> entry = iterator.next();if (entry.getValue() < 30) {iterator.remove();}
}

5. 特殊类型 Map 的遍历

5.1 ConcurrentHashMap

对于多线程环境下的并发操作,使用 ConcurrentHashMap 是线程安全的选择,可以直接使用 forEach 方法。

示例:
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.put("Alice", 25);
map.put("Bob", 30);map.forEach((key, value) -> System.out.println(key + " = " + value));

5.2 TreeMap

TreeMap 遍历时的顺序是根据键的自然顺序或指定的比较器顺序,可以用相同的方式遍历。


6. 总结

  1. 遍历 Map 时,优先选择 entrySet() + for-eachforEach (Java 8+)
  2. 如果只操作键或值,使用 keySet()values()
  3. 如果需要修改或删除 Map 中的元素,使用 Iterator
  4. 在多线程环境中,选择 ConcurrentHashMap

选择合适的遍历方式可以提升代码的效率和可读性,根据具体场景选择最佳方式!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/475776.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于单片机的条形码识别结算设计

本设计基于单片机的条形码辨识与结算系统。该系统主要用于超市、商场等场所的商品结算&#xff0c;实现了在超市内对不同种类商品进行自动识别及自动分类结算的功能。该系统由STM32F103C8T6单片机、摄像头、显示、蜂鸣器报警、按键和电源等多个模块构成。该系统可实现商品自动识…

进程间通信的信号艺术:机制、技术与实战应用深度剖析

目录 1 什么是信号 2 为什么要有信号 3 对于信号的反应 3.1 默认行为 3.2 signal()函数 -- 自定义行为对信号做出反应 3.3 对信号进行忽略 4 信号的产生的类型 4.1 kill命令 4.2 键盘输入产生信号 4.3 系统调用接口 4.3.1 kill() 4.3.2 raise() 函数 4.4 软件条件 …

美畅物联丨JT/T 808 终端设备如何加入畅联云平台

在道路运输行业中&#xff0c;JT/T 808终端设备的应用正变得越来越广泛&#xff0c;把该设备接入畅联云平台&#xff0c;能够达成更高效的车辆管理与监控功能。今天&#xff0c;我们就来探讨一下JT/T 808终端设备接入畅联云平台的步骤与要点。 一、了解畅联云平台接入要求 首先…

【微服务】SpringBoot 整合ELK使用详解

目录 一、前言 二、为什么需要ELK 三、ELK介绍 3.1 什么是elk 3.2 elk工作原理 四、ELK搭建 4.1 搭建es环境 4.1.1 获取es镜像 4.1.2 启动es容器 4.1.3 配置es参数 4.1.4 重启es容器并访问 4.2 搭建kibana 4.2.1 拉取kibana镜像 4.2.2 启动kibana容器 4.2.3 修改…

jenkins的安装(War包安装)

‌Jenkins是一个开源的持续集成工具&#xff0c;基于Java开发&#xff0c;主要用于监控持续的软件版本发布和测试项目。‌ 它提供了一个开放易用的平台&#xff0c;使软件项目能够实现持续集成。Jenkins的功能包括持续的软件版本发布和测试项目&#xff0c;以及监控外部调用执行…

低速接口项目之串口Uart开发(一)——串口UART

本节目录 一、串口UART 二、串口协议 三、串口硬件 四、往期文章链接本节内容 一、串口UART 串口UART,通用异步收发传输器&#xff08;Universal Asynchronnous Receiver / Transmitter&#xff09;,一种异步收发传输器&#xff0c;全双工传输。数据发送时&#xff0c;将并行…

WEB攻防-通用漏洞SQL注入Tamper脚本Base64Jsonmd5等

知识点&#xff1a; 1、数据表现格式类型注入&#xff1b; 2、字符转义绕过-宽字节注入&#xff1b; 3、数字&字符&搜索&编码&加密等&#xff1b; 参考资料&#xff1a; https://www.cnblogs.com/bmjoker/p/9326258.html SQL注入课程体系&#xff1a; 1、…

[Unity]TileMap开发,TileMap地图缝隙问题

环境&#xff1a; windows11 unity 2021.3.14f1c1 tilemap使用的图是美术已经拼接到一起的整图&#xff0c;块与块之间没有留缝隙 问题&#xff1a; TileMap地图直接在Unity中使用时&#xff0c;格子边缘会出现缝隙&#xff0c;移动或缩放地图时较明显。 解决方案&#x…

第75期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以找…

Vue 专属状态管理库Pinia的使用与实践

目录 前言1. 什么是 Pinia&#xff1f;2. Pinia 的安装与基本配置2.1 安装 Pinia2.2 在 Vue 应用中配置 Pinia 3. 使用 Pinia 创建和管理状态3.1 定义一个简单的 Store3.2 在组件中使用 Store 4. Pinia 的高级功能4.1 使用 Getter 简化数据处理4.2 支持异步操作4.3 在服务端渲染…

Argo workflow 拉取git 并使用pvc共享文件

文章目录 拉取 Git 仓库并读取文件使用 Kubernetes Persistent Volumes&#xff08;通过 volumeClaimTemplates&#xff09;以及任务之间如何共享数据 拉取 Git 仓库并读取文件 在 Argo Workflows 中&#xff0c;如果你想要一个任务拉取 Git 仓库中的文件&#xff0c;另一个任…

【Android】线程池的解析

引言 在Android当中根据用途分为主线程与子线程&#xff0c;主线程当中主要处理与界面相关的操作&#xff0c;子线程主要进行耗时操作。除了Thread本身以外&#xff0c;在Android当中还有很多扮演者线程的角色&#xff0c;比如AsyncTask&#xff08; 底层为线程池&#xff0c;…

【Linux网络编程】简单的UDP套接字

目录 一&#xff0c;socket编程的相关说明 1-1&#xff0c;sockaddr结构体 1-2&#xff0c;Socket API 二&#xff0c;基于Udp协议的简单通信 三&#xff0c;UDP套接字的应用 3-1&#xff0c;实现英译汉字典 一&#xff0c;socket编程的相关说明 Socket编程是一种网络通信…

【java基础】微服务篇

参考黑马八股视频。 目录 Spring Cloud 5大组件 注册中心 负载均衡 限流 CAP和BASE 分布式事务解决方案 分布式服务的接口幂等性 分布式任务调度 Spring Cloud 5大组件 注册中心 Eureka的作用 健康监控 负载均衡 限流 漏桶固定速率&#xff0c;令牌桶不限速 CAP和BA…

java八股-SpringCloud微服务-Eureka理论

文章目录 SpringCloud架构Eureka流程Nacos和Eureka的区别是&#xff1f;CAP定理Ribbon负载均衡策略自定义负载均衡策略如何实现&#xff1f;本章小结 SpringCloud架构 Eureka流程 服务提供者向Eureka注册服务信息服务消费者向注册中心拉取服务信息服务消费者使用负载均衡算法挑…

thinkphp6安装php-mqtt/client,并实现实时消息收发写入日志

thinkphp6安装php-mqtt/client,并实现实时消息收发写入日志 系统&#xff1a;centos7 第一步&#xff1a;宝塔面板安装php环境8.0&#xff1b; 第二步&#xff1a;宝塔自带安装composer; 第三步&#xff1a;下载thinkphp6 create project composer require topthink/think…

.NET9 - 新功能体验(一)

被微软形容为“迄今为止最高效、最现代、最安全、最智能、性能最高的.NET版本”——.NET 9已经发布有一周了&#xff0c;今天想和大家一起体验一下新功能。 此次.NET 9在性能、安全性和功能等方面进行了大量改进&#xff0c;包含了数千项的修改&#xff0c;今天主要和大家一起体…

K8S资源限制之ResourceQuota

ResourceQuota介绍 在K8S中&#xff0c;大部分资源都可以指定到一个名称空间下&#xff0c;因此可以对一个名称空间的计算资源&#xff0c;存储资源&#xff0c;资源数量等维度做资源限制。 如限制pod数量、svc数量&#xff0c;控制器数量&#xff0c;限制PVC请求的存储量 注…

永磁同步电机无速度算法--滑模观测器(PLL)

一、原理介绍 在永磁同步电机滑模观测器控制中&#xff0c;转子的位置和转速信息与反动电势密切相关。滑模观测器控制基本设计思路是&#xff1a;利用永磁同步电机的电压、电流信息&#xff0c;通过永磁同步电机数学模型&#xff0c;估算出电机在两相静止坐标系中的反电动势信…

NIO 与传统 IO:深入理解与应用场景

在 Java 编程中&#xff0c;IO&#xff08;输入/输出&#xff09;操作是不可或缺的一部分。Java 提供了两种主要的 IO 机制&#xff1a;传统的阻塞式 IO&#xff08;Blocking IO&#xff09;和非阻塞式 IO&#xff08;Non-blocking IO&#xff09;&#xff0c;后者通常被称为 N…