当前位置: 首页 > news >正文

Java的Map介绍以及常见方法和三种遍历方式

Java的Map介绍以及常见方法和三种遍历方式

1 Java 中的 Map 介绍

在 Java 中,Map 是一个接口,它提供了一种存储键值对(key-value pairs)的方式。每个键(key)都关联着一个值(value),并且在一个 Map 中,键是唯一的,但值可以重复。Map 接口不继承自 Collection 接口,因此它与 ListSet 等集合类不同,属于双列集合。

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 中&#xff0c;Map 是一个接口&#xff0c;它提供了一种存储键值对&#xff08;key-value pairs&#xff09;的方式。每个键&#xff08;key&#xff09;都关联着一个值&#xff08;value&#xff09;…...

C/C++基础知识复习(39)

1) 什么是封装性&#xff1f;C中如何实现封装&#xff1f; 封装性&#xff08;Encapsulation&#xff09;是面向对象编程中的一个重要概念&#xff0c;它指的是将对象的状态&#xff08;数据&#xff09;和行为&#xff08;方法&#xff09;绑定在一起&#xff0c;并且通过访问…...

自建服务器,数据安全有保障

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

CCF-GESP 编程能力认证 C++ 七级 2024年9月份判断题详细解析

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

使用Vue3+Echarts实现加载中国地图,点击省份地图下钻(完整教程)

一. 前言 在众多 ECharts 图表类型中&#xff0c;开发者始终绕不开的有各种各样的地图开发&#xff0c;关于地图开发&#xff0c;可能比其他图表相对繁琐一些&#xff0c;其实说简单也简单&#xff0c;说复杂也复杂&#xff0c;其中不乏有层级地图、3D 地图等&#xff0c;感觉…...

NUMA-非统一内存访问架构

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

初识交换机和路由器

目录 初识交换机和路由器交换机路由器主要区别工作流程如果是交换机&#xff1a;如果是路由器 初识交换机和路由器 左为路由器&#xff0c;右为交换机 交换机 交换机的前身是集线器&#xff0c;集线器是物理层的设备&#xff0c;有很多接口&#xff0c;当一台计算机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无法正常安装&#xff0c;会报错ERROR: Distro openeuler version 22.03 not supported 在openEuler上实现以cephadm安装部…...

C++哈希(一)

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

阿拉丁论文助手:一键点亮学术之路

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

视频码率到底是什么?详细说明

视频码率&#xff08;Video Bitrate&#xff09;是指在单位时间内&#xff08;通常是每秒&#xff09;传输或处理的视频数据量&#xff0c;用比特&#xff08;bit&#xff09;表示。它通常用来衡量视频文件的压缩程度和质量&#xff0c;码率越高&#xff0c;视频质量越好&#…...

嵌入式学习(17)-stm32F407串口使用注意事项

一、概述 配置串口时串口的接收一直不好使&#xff0c;对比例程发现了问题&#xff1a; 在网上也找了一些资料供参考“STM32F4的串口RX引脚不能被设置为输入是因为串口的接收&#xff08;RX&#xff09;功能是由硬件电路实现的&#xff0c;无法通过软件配置来控制。串口接收功…...

汽车48V电气系统

汽车48V电气系统 汽车48V电气系统汽车48V电气系统设计汽车48V电气系统测试汽车48V系统是48V供电和12V供电共存的么?48V供电系统是如何与12V供电系统共存的?48V电气系统测试的难点有哪些?在汽车48V电气系统通信测试中,如何向12V的控制器和48V的控制器供电?汽车48V电气系统通…...

【人工智能基础05】决策树模型习题

文章目录 1. 归一化对决策树的影响2. 选择决策树模型3. 决策树计算4. 基尼系数的优势5. 在叶子上使用线性模型的优缺点 1. 归一化对决策树的影响 题目&#xff1a;对于一些机器学习模型&#xff08;例如&#xff0c;神经网络&#xff09;&#xff0c;对特征进行归一化(normaliz…...

rockit 学习、开发笔记(六)(VENC)

前言 上节我们讲到了VDEC解码模块&#xff0c;那当然少不了VENC编码模块了&#xff0c;一般有编解码的需求都是为了压缩视频的大小&#xff0c;方便减少传输所占用的带宽。 概述 VENC 模块&#xff0c;即视频编码模块。本模块支持多路实时编码&#xff0c;且每路编码独立&am…...

spring技术点

引入对象 Autowired 和 Resource的区别 Autowired 和 Resource的区别 valid 参数校验 jarkata进行SpringMVC校验 常规当前进行校验的配置操作&#xff0c;参考文档如下进行操作。 SpringMVC校验注解不生效 List类型参数校验 由于list类型默认不能进行标注校验实现&#x…...

R语言使用“纽约市数据集中的优步皮卡”数据创建不同年度时间范围的可视化

一、项目背景 为了分析纽约市优步&#xff08;https://baike.baidu.com/item/Uber/14900884&#xff09;皮卡在不同年度的使用情况&#xff0c;需要利用R语言进行数据可视化。通过对比不同年度的数据&#xff0c;可以揭示出优步皮卡使用的趋势和变化。 二、数据准备 数据集&a…...

电阻计RM3544、RM3545的使用

目录&#xff1a; 一、电阻计与PC通讯 1、硬件连接 2、RmLogger.exe的使用 二、RM3545测量35uΩ电阻 一、电阻计与PC通讯 1、硬件连接 可以设置USB或COM口(串口)连接PC&#xff0c;也可以设置为“打印”输出。 1&#xff09;使用USB连接PC 2&#xff09;使用串口连接PC …...

Unity 策略游戏地图上的网格是如何实现的

在Unity中实现策略游戏地图上的网格&#xff0c;主要涉及到地图数据的处理、地图的加载与渲染、以及玩家在地图上的移动与碰撞检测等关键步骤。以下是对这些步骤的详细解释&#xff1a; 一、地图数据的处理 收集地图数据&#xff1a;这包括地形高度、地形纹理、建筑物、树木等…...

嵌入式LCD轻量级驱动库:双缓冲与脏区域优化

1. 项目概述Lctrl_Lcd是一个面向嵌入式平台的轻量级 LCD 显示控制库&#xff0c;其设计目标并非替代完整的图形框架&#xff08;如 LVGL 或 emWin&#xff09;&#xff0c;而是为裸机&#xff08;Bare-Metal&#xff09;或实时操作系统&#xff08;RTOS&#xff09;环境下的中低…...

如何高效解析和生成PSD文件:Ag-PSD库完整指南

如何高效解析和生成PSD文件&#xff1a;Ag-PSD库完整指南 【免费下载链接】ag-psd Javascript library for reading and writing PSD files 项目地址: https://gitcode.com/gh_mirrors/ag/ag-psd 在当今数字设计工作流中&#xff0c;Photoshop文档&#xff08;PSD&#…...

探索ArtPlayer:如何通过轻量高效的HTML5视频引擎实现全场景适配播放体验

探索ArtPlayer&#xff1a;如何通过轻量高效的HTML5视频引擎实现全场景适配播放体验 【免费下载链接】ArtPlayer :art: ArtPlayer.js is a modern and full featured HTML5 video player 项目地址: https://gitcode.com/gh_mirrors/ar/ArtPlayer 在数字内容爆发的时代&a…...

OpenClaw多通道控制:Qwen3-32B-Chat同时响应飞书与网页端指令

OpenClaw多通道控制&#xff1a;Qwen3-32B-Chat同时响应飞书与网页端指令 1. 为什么需要多通道控制&#xff1f; 上周三晚上11点&#xff0c;我正在用OpenClaw的网页控制台整理项目文档&#xff0c;突然飞书弹出同事的紧急需求&#xff1a;"能不能立刻帮我生成上季度销售…...

从硬件到空域:拆解一个真实的无人机Remote ID广播包,聊聊合规与隐私

从硬件到空域&#xff1a;拆解无人机Remote ID广播包的技术与合规全景 当一架多旋翼无人机在低空掠过城市天际线时&#xff0c;它的存在不仅通过旋翼的嗡鸣声宣告&#xff0c;更通过无线电波向方圆数公里广播着自己的"数字身份证"。这种被称为Remote ID的技术&#x…...

终极指南:掌握Starlight文档导航自定义排序的7个高级技巧

终极指南&#xff1a;掌握Starlight文档导航自定义排序的7个高级技巧 【免费下载链接】starlight &#x1f31f; Build beautiful, accessible, high-performance documentation websites with Astro 项目地址: https://gitcode.com/gh_mirrors/st/starlight Starlight是…...

掌握8个wxappUnpacker实战技巧:小程序解包与代码还原完全指南

掌握8个wxappUnpacker实战技巧&#xff1a;小程序解包与代码还原完全指南 【免费下载链接】wxappUnpacker 项目地址: https://gitcode.com/gh_mirrors/wxappu/wxappUnpacker 为什么90%的小程序开发者都需要解包工具&#xff1f; 在小程序开发过程中&#xff0c;开发者…...

PyTorch模型的TensorRT优化:原理与实践

PyTorch模型的TensorRT优化&#xff1a;原理与实践 1. 背景与意义 在深度学习模型部署过程中&#xff0c;推理速度是一个关键指标。TensorRT是NVIDIA开发的高性能深度学习推理优化库&#xff0c;它可以显著提高模型的推理速度&#xff0c;降低延迟。本文将深入探讨TensorRT的工…...

LiuJuan20260223Zimage与Typora协作:智能化Markdown文档创作

LiuJuan20260223Zimage与Typora协作&#xff1a;智能化Markdown文档创作 每次打开Typora&#xff0c;看着那个简洁到极致的界面&#xff0c;我都会有种创作的冲动。但冲动归冲动&#xff0c;真到了要写一篇技术博客、整理一份项目文档&#xff0c;或者梳理一堆零散笔记的时候&…...

视频内容自动打标:基于Emotion2Vec+ Large的语音情绪分析方案

视频内容自动打标&#xff1a;基于Emotion2Vec Large的语音情绪分析方案 1. 引言&#xff1a;语音情绪分析在视频内容管理中的价值 在视频内容爆炸式增长的今天&#xff0c;如何高效管理和检索海量视频素材成为内容平台面临的重大挑战。传统的人工打标方式不仅效率低下&#…...