Java的Map介绍以及常见方法和三种遍历方式
Java的Map介绍以及常见方法和三种遍历方式
1 Java 中的 Map 介绍
在 Java 中,Map
是一个接口,它提供了一种存储键值对(key-value pairs)的方式。每个键(key)都关联着一个值(value),并且在一个 Map
中,键是唯一的,但值可以重复。Map
接口不继承自 Collection
接口,因此它与 List
、Set
等集合类不同,属于双列集合。
1.1 Map 的特点
- 键值对存储:
Map
存储的是键值对,其中键用于唯一标识一个条目,而值则是该条目的具体内容。 - 键的唯一性:同一个
Map
中不能存在两个相同的键,但如果两个键相等(根据equals
方法判断),则后插入的键值对会覆盖之前的键值对。 - 值的可重复性:虽然键必须唯一,但值可以重复。
- 无序性:大多数
Map
实现并不保证元素的顺序,除非使用了如LinkedHashMap
这样的特定实现。
1. 2 常见的 Map 实现
HashMap
:基于哈希表实现,提供了快速的查找、插入和删除操作,但不保证元素的顺序。允许null
键和null
值。TreeMap
:基于红黑树实现,能够对键进行自然排序或通过指定的比较器排序。不允许null
键,但允许null
值。LinkedHashMap
:结合了HashMap
和链表的优点,既保持了插入顺序,又提供了高效的查找性能。Hashtable
:类似于HashMap
,但它线程安全,不允许null
键和null
值。由于其同步特性,性能通常低于HashMap
。
2 Map 的常见方法
Map
接口定义了一系列常用的方法来操作键值对,以下是其中一些重要的方法,并附带示例代码:
2.1 添加/更新
put(K key, V value)
:将指定的键值对添加到Map
中,如果键已存在,则更新其对应的值,并返回旧值;如果键不存在,则返回null
。void putAll(Map<? extends K, ? extends V> m)
:将另一个Map
中的所有键值对复制到当前Map
中。
Map<String, Integer> map = new HashMap<>();
map.put("Alice", 25); // 添加键值对
System.out.println(map.put("Alice", 30)); // 更新键值对,返回旧值 25
Map<String, Integer> anotherMap = new HashMap<>();
anotherMap.put("Bob", 30);
anotherMap.put("Charlie", 35);
map.putAll(anotherMap); // 将 anotherMap 的所有键值对复制到 map 中
System.out.println(map); // 输出: {Alice=30, Bob=30, Charlie=35}
2.2 删除
remove(Object key)
:根据指定的键删除相应的键值对,并返回被删除的值;如果键不存在,则返回null
。void clear()
:清空Map
中的所有键值对。
System.out.println(map.remove("Alice")); // 删除键 "Alice",返回值 30
map.clear(); // 清空 map
System.out.println(map); // 输出: {}
2.3 获取
get(Object key)
:根据指定的键获取对应的值;如果键不存在,则返回null
。boolean containsKey(Object key)
:检查Map
是否包含指定的键。boolean containsValue(Object value)
:检查Map
是否包含指定的值。
map.put("Alice", 25);
map.put("Bob", 30);
System.out.println(map.get("Alice")); // 获取键 "Alice" 对应的值,输出 25
System.out.println(map.containsKey("Alice")); // 检查是否包含键 "Alice",输出 true
System.out.println(map.containsValue(30)); // 检查是否包含值 30,输出 true
2.4 查询
int size()
:返回Map
中键值对的数量。boolean isEmpty()
:判断Map
是否为空。
System.out.println(map.size()); // 输出 2
System.out.println(map.isEmpty()); // 输出 false
map.clear();
System.out.println(map.isEmpty()); // 输出 true
3 Map 的三种遍历方式
遍历 Map
是指访问 Map
中所有的键值对。Java 提供了多种遍历 Map
的方法,以下是三种常见的遍历方式,并附带示例代码:
3.1 使用 entrySet()
遍历
这是最推荐的方式,因为它效率最高,可以直接访问键和值,避免了多次调用 get()
方法带来的性能开销。entrySet()
返回的是一个包含所有键值对的 Set
,每个元素都是一个 Map.Entry
对象,可以通过 getKey()
和 getValue()
方法分别获取键和值。
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()) {System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
}
这种方式不仅代码简洁,而且性能优越,因为它是直接访问键值对,而不是通过键来查找值。
3.2 使用 keySet()
遍历
keySet()
返回的是一个包含所有键的 Set
,然后可以通过 get()
方法根据键来获取对应的值。这种方法适用于只需要遍历键的情况,但如果需要同时访问键和值,则效率较低,因为每次都需要调用 get()
方法来获取值。
for (String key : map.keySet()) {System.out.println("Key: " + key + ", Value: " + map.get(key));
}
尽管这种遍历方式在某些情况下可能是必要的,但它通常不如 entrySet()
方式高效。
3.3 使用 values()
遍历
values()
返回的是一个包含所有值的 Collection
,适用于只需要遍历值的情况。然而,这种方法无法直接访问键,因此在需要同时访问键和值时并不适用。
for (Integer value : map.values()) {System.out.println("Value: " + value);
}
这种方式适合于只需要处理值的场景,但如果需要访问键,则不适合使用。
总结
Map
是 Java 中非常重要的数据结构之一,广泛应用于各种应用场景中。了解 Map
的基本概念、常见方法以及如何高效地遍历 Map
,对于编写高质量的 Java 程序至关重要。通过选择合适的 Map
实现和遍历方式,可以显著提高代码的性能和可读性。在实际开发中,应根据具体需求选择最适合的 Map
实现,并采用最合适的遍历方式来优化程序性能。
相关文章:
Java的Map介绍以及常见方法和三种遍历方式
Java的Map介绍以及常见方法和三种遍历方式 1 Java 中的 Map 介绍 在 Java 中,Map 是一个接口,它提供了一种存储键值对(key-value pairs)的方式。每个键(key)都关联着一个值(value)…...
C/C++基础知识复习(39)
1) 什么是封装性?C中如何实现封装? 封装性(Encapsulation)是面向对象编程中的一个重要概念,它指的是将对象的状态(数据)和行为(方法)绑定在一起,并且通过访问…...

自建服务器,数据安全有保障
在远程桌面工具的选择上,向日葵和TeamViewer功能强大,但都存在收费昂贵、依赖第三方服务器、数据隐私难以完全掌控等问题。相比之下,RustDesk 凭借开源免费、自建服务的特性脱颖而出!用户可以在自己的服务器上部署RustDesk服务端&…...

CCF-GESP 编程能力认证 C++ 七级 2024年9月份判断题详细解析
链接:CCF-GESP 编程能力认证 C 七级 2024年9月份选择题详细解析-CSDN博客 目录 第 1 题 第 2 题 第 3 题 第 4 题 第 5 题 第 6 题 第 7 题 第 8 题 第 9 题 第 10 题 第 1 题 表达式 a << 1 的结果为 a(错误) 【a是字符常…...

使用Vue3+Echarts实现加载中国地图,点击省份地图下钻(完整教程)
一. 前言 在众多 ECharts 图表类型中,开发者始终绕不开的有各种各样的地图开发,关于地图开发,可能比其他图表相对繁琐一些,其实说简单也简单,说复杂也复杂,其中不乏有层级地图、3D 地图等,感觉…...

NUMA-非统一内存访问架构
NUMA(Non-Uniform Memory Access) 是一种计算机内存架构,主要用于多处理器系统。NUMA架构中的每个处理器都连接到自己的本地内存,并且可以访问其他处理器的内存,但访问其他处理器的内存速度较慢。 内核通过调度优化进…...

初识交换机和路由器
目录 初识交换机和路由器交换机路由器主要区别工作流程如果是交换机:如果是路由器 初识交换机和路由器 左为路由器,右为交换机 交换机 交换机的前身是集线器,集线器是物理层的设备,有很多接口,当一台计算机A想发消息…...
SQL面试题——滴滴SQL面试题 取出累计值与1000差值最小的记录
滴滴SQL面试题 取出累计值与1000差值最小的记录 今天的题目来自滴滴出行 已知有表cost_detail包含id和money两列,id为自增,请累加计算money值,并求出累加值与1000差值最小的记录。 +-----+--------+ | id | money | +-----+--------+ | 1 | 200 | | 2 | 300 …...

openEuler 22.03 使用cephadm安装部署ceph集群
目录 目的步骤规格步骤ceph部署前准备工作安装部署ceph集群ceph集群添加node与osdceph集群一些操作组件服务操作集群进程操作 目的 使用ceph官网的cephadm无法正常安装,会报错ERROR: Distro openeuler version 22.03 not supported 在openEuler上实现以cephadm安装部…...

C++哈希(一)
1.底层结构 顺序结构以及平衡中,元素关键码与其存储位置之间没有相对应的关系,因此在查找一个元素时,要经过关键码的多次比较。顺序查找的时间复杂度为O(N)。 理想的搜索方法:可以不经过比较,依次直接从表中直接搜索…...

阿拉丁论文助手:一键点亮学术之路
在学术研究的海洋中,每一位学者都渴望拥有一盏能够照亮前行道路的神灯。阿拉丁论文助手,正是这样一盏神奇的灯,它以其先进的人工智能技术和丰富的学术资源,为学者们的学术写作提供了全方位的支持。 一、阿拉丁论文助手简介 阿拉丁…...

视频码率到底是什么?详细说明
视频码率(Video Bitrate)是指在单位时间内(通常是每秒)传输或处理的视频数据量,用比特(bit)表示。它通常用来衡量视频文件的压缩程度和质量,码率越高,视频质量越好&#…...

嵌入式学习(17)-stm32F407串口使用注意事项
一、概述 配置串口时串口的接收一直不好使,对比例程发现了问题: 在网上也找了一些资料供参考“STM32F4的串口RX引脚不能被设置为输入是因为串口的接收(RX)功能是由硬件电路实现的,无法通过软件配置来控制。串口接收功…...
汽车48V电气系统
汽车48V电气系统 汽车48V电气系统汽车48V电气系统设计汽车48V电气系统测试汽车48V系统是48V供电和12V供电共存的么?48V供电系统是如何与12V供电系统共存的?48V电气系统测试的难点有哪些?在汽车48V电气系统通信测试中,如何向12V的控制器和48V的控制器供电?汽车48V电气系统通…...

【人工智能基础05】决策树模型习题
文章目录 1. 归一化对决策树的影响2. 选择决策树模型3. 决策树计算4. 基尼系数的优势5. 在叶子上使用线性模型的优缺点 1. 归一化对决策树的影响 题目:对于一些机器学习模型(例如,神经网络),对特征进行归一化(normaliz…...

rockit 学习、开发笔记(六)(VENC)
前言 上节我们讲到了VDEC解码模块,那当然少不了VENC编码模块了,一般有编解码的需求都是为了压缩视频的大小,方便减少传输所占用的带宽。 概述 VENC 模块,即视频编码模块。本模块支持多路实时编码,且每路编码独立&am…...
spring技术点
引入对象 Autowired 和 Resource的区别 Autowired 和 Resource的区别 valid 参数校验 jarkata进行SpringMVC校验 常规当前进行校验的配置操作,参考文档如下进行操作。 SpringMVC校验注解不生效 List类型参数校验 由于list类型默认不能进行标注校验实现&#x…...
R语言使用“纽约市数据集中的优步皮卡”数据创建不同年度时间范围的可视化
一、项目背景 为了分析纽约市优步(https://baike.baidu.com/item/Uber/14900884)皮卡在不同年度的使用情况,需要利用R语言进行数据可视化。通过对比不同年度的数据,可以揭示出优步皮卡使用的趋势和变化。 二、数据准备 数据集&a…...

电阻计RM3544、RM3545的使用
目录: 一、电阻计与PC通讯 1、硬件连接 2、RmLogger.exe的使用 二、RM3545测量35uΩ电阻 一、电阻计与PC通讯 1、硬件连接 可以设置USB或COM口(串口)连接PC,也可以设置为“打印”输出。 1)使用USB连接PC 2)使用串口连接PC …...
Unity 策略游戏地图上的网格是如何实现的
在Unity中实现策略游戏地图上的网格,主要涉及到地图数据的处理、地图的加载与渲染、以及玩家在地图上的移动与碰撞检测等关键步骤。以下是对这些步骤的详细解释: 一、地图数据的处理 收集地图数据:这包括地形高度、地形纹理、建筑物、树木等…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...