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中实现策略游戏地图上的网格,主要涉及到地图数据的处理、地图的加载与渲染、以及玩家在地图上的移动与碰撞检测等关键步骤。以下是对这些步骤的详细解释: 一、地图数据的处理 收集地图数据:这包括地形高度、地形纹理、建筑物、树木等…...
避坑指南:解决Livox Mid-360双雷达点云融合时坐标系错乱与IMU数据混杂问题
Livox Mid-360双雷达点云融合实战:坐标系校准与IMU数据分离全解析 当你在RViz中看到两个Livox Mid-360雷达的点云像醉酒的水母一样随机飘动,而IMU数据又像被搅拌机混合过的果汁——恭喜你,遇到了多传感器融合的经典难题。这不是简单的参数调整…...
AIVideo效果展示:输入主题输出专业视频,惊艳案例分享
AIVideo效果展示:输入主题输出专业视频,惊艳案例分享 1. 专业级视频生成效果概览 AIVideo一站式AI长视频工具能够将简单的文字主题转化为完整的专业视频作品。只需输入一个主题,系统就会自动完成从文案创作、分镜设计、画面生成到配音剪辑的…...
Llama-3.2V-11B-cot代码实例:Streamlit中图片上传与缓存机制
Llama-3.2V-11B-cot代码实例:Streamlit中图片上传与缓存机制 1. 项目概述 Llama-3.2V-11B-cot是基于Meta Llama-3.2V-11B-cot多模态大模型开发的高性能视觉推理工具,专为双卡4090环境优化。该工具通过Streamlit构建了直观易用的交互界面,特…...
高效管理惠普OMEN游戏本:OmenSuperHub全面解析与实战指南
高效管理惠普OMEN游戏本:OmenSuperHub全面解析与实战指南 【免费下载链接】OmenSuperHub 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub OmenSuperHub是一款专为惠普OMEN系列游戏本设计的轻量级系统管理工具,它通过替代原厂Omen Ga…...
云上实战说 | TapNow x Google Cloud 带您体验从灵感到资产的秒级转化
以下文章来源于谷歌云服务,作者 Google Cloud基于 Google Cloud Veo 和 Nano Banana 的前沿能力,TapNow (万物形象所) 邀您体验生成式 AI 如何重塑品牌与自我表达。现场实时生成风格化写真、宠物贴纸及周边,直观感受从灵感到资产的极速转化&a…...
CTE、临时表、子查询如何选?
在 SQL Server 等关系型数据库中,处理复杂查询逻辑时,子查询 (Subquery)、临时表 (Temporary Table) 和公共表表达式 (CTE, Common Table Expression) 是三种核心工具。它们各有优劣,选择哪种取决于具体的性能需求、数据规模、代码可读性以及…...
python-flask-djangol框架的膳食营养食谱管理系统
目录需求分析技术选型数据库设计核心功能实现界面设计测试与部署维护与扩展项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作需求分析 膳食营养食谱管理系统需要具备用户管理、食谱管理、营养分析、购物清单生成等功能。系统应支…...
Google与Cohere发布新一代音频AI模型
Google LLC和Cohere Inc.今日发布了专为音频处理任务优化的新人工智能模型。这家搜索巨头的算法Gemini 3.1 Flash Live能够自动化客户服务交互。Cohere的新AI模型则专为语音转录而设计。两款模型的输出质量都比其前代产品有显著提升。企业可使用Gemini 3.1 Flash Live构建语音智…...
从AlexNet到ResNet:图解十大经典CV网络模型,帮你快速选对项目‘骨架’
从AlexNet到ResNet:十大经典CV网络模型实战选型指南 当你第一次面对ImageNet数据集时,可能会被各种网络架构的选择弄得眼花缭乱。VGG的深度堆叠、GoogLeNet的并行结构、ResNet的短路连接——这些设计理念背后,是计算机视觉领域十年来的智慧结…...
51单片机Proteus仿真实战:从零构建流水灯系统
1. 环境准备:搭建51单片机开发环境 第一次接触51单片机的朋友可能会被各种工具软件搞晕,其实只需要两个核心工具就能完成流水灯仿真:Proteus和Keil。我刚开始学单片机时也踩过不少坑,这里把最稳定的版本和安装要点分享给大家。 Pr…...
