【Java 基础篇】深入了解Java中的键值对集合:Map集合详解

news2024/11/20 2:40:57

在这里插入图片描述

Map是Java中常用的数据结构之一,用于存储键值对(Key-Value)映射。它提供了快速的查找和访问能力,是编程中常用的工具之一。本文将深入介绍Java中的Map集合,包括常见的Map实现类、基本操作、使用示例以及一些重要的注意事项。

Map的基本概念

在开始之前,让我们先了解一些基本的Map概念:

  • 键(Key):每个键必须是唯一的,用于查找和访问值。
  • 值(Value):与键相关联的数据。
  • 键值对(Entry):表示键和值的组合。
  • 映射(Mapping):键和值之间的关系。

常见的Map实现类

Java提供了多种Map实现类,每种都有不同的特点和用途。以下是一些常见的Map实现类:

  1. HashMap:基于哈希表的实现,提供了快速的插入和查找性能。但不保证元素的顺序。

  2. TreeMap:基于红黑树的实现,元素按键的自然顺序或自定义顺序排序。

  3. LinkedHashMap:基于哈希表和双向链表的实现,保持了元素的插入顺序。

  4. HashTable:早期的哈希表实现,线程安全,不推荐使用。

  5. ConcurrentHashMap:线程安全的哈希表实现,适用于多线程环境。

基本操作

1. 创建Map对象

要创建一个Map对象,可以使用其实现类的构造函数。例如,创建一个HashMap:

Map<String, Integer> hashMap = new HashMap<>();

2. 添加键值对

使用put方法可以向Map中添加键值对:

hashMap.put("apple", 1);
hashMap.put("banana", 2);

3. 获取值

通过键获取对应的值:

int value = hashMap.get("apple"); // 返回1

4. 移除键值对

使用remove方法可以从Map中移除键值对:

hashMap.remove("apple");

5. 判断键是否存在

可以使用containsKey方法来判断键是否存在:

boolean contains = hashMap.containsKey("apple"); // 返回false

6. 获取所有键或值

使用keySet方法可以获取所有的键,而使用values方法可以获取所有的值:

Set<String> keys = hashMap.keySet();
Collection<Integer> values = hashMap.values();

7. 遍历Map

可以使用迭代器或增强for循环来遍历Map中的键值对:

for (Map.Entry<String, Integer> entry : hashMap.entrySet()) {
    String key = entry.getKey();
    int value = entry.getValue();
    System.out.println(key + ": " + value);
}

使用示例

以下是一个简单的示例,演示如何使用Map来统计一段文本中单词的出现次数:

public static void main(String[] args) {
    String text = "This is a sample text. This text contains sample words.";

    // 创建一个Map来存储单词和出现次数
    Map<String, Integer> wordCountMap = new HashMap<>();

    // 使用正则表达式分割文本并统计单词
    String[] words = text.split("\\s+");
    for (String word : words) {
        // 删除标点符号
        word = word.replaceAll("[^a-zA-Z]", "").toLowerCase();

        // 更新单词的出现次数
        wordCountMap.put(word, wordCountMap.getOrDefault(word, 0) + 1);
    }

    // 打印单词和出现次数
    for (Map.Entry<String, Integer> entry : wordCountMap.entrySet()) {
        System.out.println(entry.getKey() + ": " + entry.getValue());
    }
}

这个示例将文本分割成单词,并统计每个单词的出现次数,然后将结果存储在Map中。

Map 集合的更多使用方法

当涉及到使用Java中的Map集合时,还有一些高级用法和方法可以帮助您更灵活、高效地操作数据。接下来,我们将介绍一些Map集合的更多使用方法:

1. 使用putIfAbsent方法

putIfAbsent方法可以用于在向Map中添加元素时检查是否已经存在相同的键。如果键不存在,它将添加键值对;如果键已存在,它将保持原有的值不变。

Map<String, Integer> map = new HashMap<>();
map.put("apple", 1);

map.putIfAbsent("apple", 2); // 不会生效,键"apple"已存在
map.putIfAbsent("banana", 3); // 添加键值对"banana"->3

2. 使用computecomputeIfAbsent方法

compute方法可以用于根据现有的键值对来计算新的值,它接受一个键和一个BiFunction函数作为参数。computeIfAbsent方法则是在键不存在时才计算新值,它接受一个键和一个Function函数。

Map<String, Integer> map = new HashMap<>();
map.put("apple", 1);

map.compute("apple", (k, v) -> v + 1); // 更新键"apple"的值为2
map.compute("banana", (k, v) -> v + 1); // 不会生效,键"banana"不存在

map.computeIfAbsent("banana", k -> 1); // 添加键值对"banana"->1

3. 使用merge方法

merge方法可以用于合并现有的键值对,它接受一个键、一个新值和一个BiFunction函数作为参数。如果键不存在,它将添加新键值对;如果键已存在,它将根据BiFunction函数的逻辑合并值。

Map<String, Integer> map = new HashMap<>();
map.put("apple", 1);

map.merge("apple", 2, (oldValue, newValue) -> oldValue + newValue); // 更新键"apple"的值为3
map.merge("banana", 1, (oldValue, newValue) -> oldValue + newValue); // 添加键值对"banana"->1

4. 使用forEach方法

forEach方法可以用于遍历Map中的键值对,可以接受一个BiConsumer函数来处理每个键值对。

Map<String, Integer> map = new HashMap<>();
map.put("apple", 1);
map.put("banana", 2);
map.put("cherry", 3);

map.forEach((key, value) -> System.out.println(key + ": " + value));

5. 使用computeIfPresent方法

computeIfPresent方法可以在键存在时才计算新值,它接受一个键和一个BiFunction函数作为参数。

Map<String, Integer> map = new HashMap<>();
map.put("apple", 1);

map.computeIfPresent("apple", (key, value) -> value + 1); // 更新键"apple"的值为2
map.computeIfPresent("banana", (key, value) -> value + 1); // 不会生效,键"banana"不存在

6. 使用replaceAll方法

replaceAll方法可以用于替换Map中所有的值,它接受一个BiFunction函数作为参数,用于计算新值。

Map<String, Integer> map = new HashMap<>();
map.put("apple", 1);
map.put("banana", 2);

map.replaceAll((key, value) -> value * 2); // 将所有值乘以2

7. 使用merge方法进行默认值设置

如果要为Map中的某个键设置默认值,可以使用merge方法:

Map<String, Integer> map = new HashMap<>();
map.put("apple", 1);

map.merge("banana", 10, Integer::sum); // 如果键"banana"不存在,将其值设置为10,如果存在,则使用sum函数合并值

这些高级用法可以帮助您更灵活地处理Map集合中的数据,根据需求选择合适的方法来操作键值对。记住,在使用Map时,根据具体场景选择合适的方法非常重要,可以提高代码的可读性和性能。

注意事项和最佳实践

在使用Map时,有一些注意事项和最佳实践需要记住:

1. 键的唯一性

Map中的键必须是唯一的。如果尝试使用相同的键添加新值,将会覆盖旧值。

2. 使用合适的Map实现类

选择适合您需求的Map实现类非常重要。如果需要快速的查找操作,可以选择HashMap;如果需要有序的键值对,可以选择TreeMap;如果需要线程安全,可以选择ConcurrentHashMap。

3. 考虑键和值的类型

Map可以使用不同类型的键和

值。确保键和值的类型能够满足您的需求,不会引发类型转换错误。

4. 遍历Map时使用EntrySet

当遍历Map时,使用entrySet方法来获取键值对集合,而不是先获取键集合再逐个获取值。这样可以提高性能。

5. 考虑性能和内存消耗

在处理大量数据时,要注意Map的性能和内存消耗。选择合适的数据结构和算法以确保性能。

结语

本文详细介绍了Java中的Map集合,包括常见的Map实现类、基本操作、使用示例以及注意事项和最佳实践。Map是Java编程中非常有用的数据结构,掌握它的使用方法对于开发高效的应用程序非常重要。希望本文能够帮助您更好地理解和利用Java中的Map集合。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++基础:字符串

字符串 字符串是一种非常常见的数据类型&#xff0c;用于存储和操作文本数据。C提供了多种方式来表示字符串&#xff0c;其中最常用的是使用std::string类。以下是关于C字符串的一些基本信息和操作示例&#xff1a; 字符 : ’ (单引号是一个字符&#xff0c;如果要赋值成数组…

【服务器】带外管理口 iDRAC接口

服务器带外管理口 也就是标识为iDRAC的接口 使用时&#xff0c;将笔记本直接通过网线连接到这个接口 笔记本上设置以太网连接的属性为手动IP&#xff0c;例如192.168.0.100 然后ping 192.168.0.120&#xff08;服务器的默认的带外IP&#xff09; 理论上应该是好使的

FastJSON将对象转JSON字符串引发的血案

问题&#xff1a;最近工作中需要将一个将近两百页的pdf的base64作为value转成JSON字符串&#xff0c;而代码中使用的方案就是JSONObject.toJSONString(obj); 而结果就是引发了OOM内存溢出。 翻阅源码找到一段关键点&#xff1a; 也就是说FastJSON内部设置了一个阈值&#xff…

【Node.js】认识express并创建基本web服务器:

文章目录 一、初识 Express【1】Express 简介【2】Express 的基本使用【3】托管静态资源【4】nodemon 二、Express 路由【1】路由的概念【2】路由的使用 三、Express 中间件【1】中间件的概念【2】Express 中间件的初体验【3】中间件的分类【4】自定义中间件 四、使用 Express …

钉钉群机器人撤回信息-实操详细教程

仅支持企业应用 1.在开发平台创建机器人&#xff0c;勾选机器人配置 发布 最终要在这里能找到才算成功 注&#xff1a;发布后要在钉钉内部群添加机器人选择新建的 第一步&#xff1a;获取accessToken&#xff08;程序权限&#xff09; 找到Appkey和AppSecret import requests…

JWT 安全及案例实战

文章目录 一、JWT (json web token)安全1. Cookie&#xff08;放在浏览器&#xff09;2. Session&#xff08;放在服务器&#xff09;3. Token4. JWT (json web token)4.1 头部4.1.1 alg4.1.2 typ 4.2 payload4.3 签名4.4 通信流程 5. 防御措施 二、漏洞实例&#xff08;webgoa…

教你自己制作一个ALU

计算机在没有齿轮的时候是如何负责运算的呢&#xff1f; ALU就是计算机里负责运算的组件&#xff0c;这篇文章就是教你自己做一个ALU 第一个ALU 1970年&#xff0c;第一个封装在单个芯片内的完整ALU——英特尔74181诞生&#xff0c;这在当时是惊人的工程壮举&#xff01; 算…

微信小程序的疫苗接种预约设计与实现vue+uniapp

对于本小程序的疫苗预约的设计来说&#xff0c;系统开发主要是采用java语言&#xff0c;在整个系统的设计中应用MySql数据库来完成数据存储&#xff0c;具体根据疫苗预约信息的现状来进行开发的&#xff0c;具体根据现实的需求来实现疫苗预约网络化的管理&#xff0c;各类信息有…

华为云云耀云服务器L实例评测|StackEdit中文版在线Markdown笔记工具

华为云云耀云服务器L实例评测&#xff5c;StackEdit中文版在线Markdown笔记工具 一、云耀云服务器L实例介绍1.1 云服务器介绍1.2 应用场景1.3 支持镜像 二、云耀云服务器L实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置 三、部署 StackEdit 中文版3.1 StackEdit 介绍3.2 环…

C语言基础语法复习06-c语言关键字

ANSI标准定义的C语言关键字共32个: void char int float double short long signed unsigned struct union enum typedef sizeof auto static register extern const volatile return continue break goto if else switch case default for do while C99新增关键字&#xff1a;…

1222.可以攻击国王的皇后

在一个 8x8 的棋盘上&#xff0c;放置着若干「黑皇后」和一个「白国王」。 给定一个由整数坐标组成的数组 queens &#xff0c;表示黑皇后的位置&#xff1b;以及一对坐标 king &#xff0c;表示白国王的位置&#xff0c;返回所有可以攻击国王的皇后的坐标(任意顺序)。 示例 1…

Spring续集

6.2、转发视图 SpringMVC中默认的转发视图是InternalResourceView SpringMVC中创建转发视图的情况&#xff1a; 当控制器方法中所设置的视图名称以"forward:"为前缀时&#xff0c;创建InternalResourceView视图&#xff0c;此时的视图名称不会被SpringMVC配置文件中所…

前后端开发接口联调对接参数

前言 一个完整的互联网系统项目,需要前后端配合,进行上线,针对前端开发者,现在互联网主流的项目都是前后端分离 也就是后端负责提供数据接口,前端负责UI界面数据渲染 凡是在前台数据展示与用户交互的,都是由前端来实现的,而数据来源是由后台服务提供的 在浏览器c端能够发送后端…

STM32 ~ GPIO不同模式之间的区别与实现原理

GPIO全称General Purpose Input Output &#xff0c;即通用输入/输出。其实GPIO的本质就是芯片的一个引脚&#xff0c;通常在ARM中所有的I/O都是通用的。不过&#xff0c;由于每个开发板上都会设计不同的外围电路&#xff0c;这就造成了GPIO的功能可能有所不同。大部分GPIO都是…

百度测开初面面试题分享(答案+文档)

1、java常用的异常处理机制 Java常用的异常处理机制有以下几种&#xff1a; 1&#xff09;try-catch-finally语句&#xff1a;用于捕获和处理异常。将可能抛出异常的代码放在try块中&#xff0c;然后在catch块中处理异常。无论是否发生异常&#xff0c;finally块中的代码都会…

算法总结10 线段树

算法总结10 线段树 线段树2569. 更新数组后处理求和查询 线段树 有一个数组&#xff0c;我们要&#xff1a; 更新数组的值&#xff08;例如&#xff1a;都加上一个数&#xff0c;把子数组内的元素取反&#xff09;查询一个子数组的值&#xff08;例如&#xff1a;求和&#x…

【进阶篇】MySQL数据库中的 锁详解

文章目录 1. 介绍2. MySQL 锁类型3. 锁的粒度4. 锁的使用场景和示例5. 锁的性能优化和注意事项6. MySQL 的锁机制和实现细节1. 锁的存储和管理2. 锁的竞争和调度3. 锁的实现原理 7. 锁的调优和故障处理1. 锁等待和超时&#xff1a;2. 死锁处理和恢复&#xff1a;3. 锁的监控和分…

AtCoder Beginner Contest 313 C 一个序列同时加一个数和减一个数,直到最大和最小之间相差最大为1(结论可记住)

AtCoder Beginner Contest 313 C 做题链接&#xff1a;AtCoder Beginner Contest 313 问题陈述 给你一个整数序列 A(A1​,A2​,…,AN​)。你可以执行以下操作任意次数&#xff08;可能为零&#xff09;。 选择带有 1≤i,j≤N的整数 i和 j。将Ai​减少 1&#xff0c;将Aj​增…

珂学送分

从后往前倒着走。 先找出每个点能走到的最远的右端点是什么&#xff0c;记录为r[i]&#xff0c;每个点i可能分为的情况有(r[i] - i 1)种&#xff0c;每一种的概率是1 / (r[i] - i 1)&#xff0c;&#xff08;每一种的概率乘以它后面那个格子的期望&#xff09;之和再加自己的…

Python用若干列的数据多条件筛选、去除Excel数据并批量绘制直方图

本文介绍基于Python&#xff0c;读取Excel数据&#xff0c;以一列数据的值为标准&#xff0c;对这一列数据处于指定范围的所有行&#xff0c;再用其他几列数据数值&#xff0c;加以筛选与剔除&#xff1b;同时&#xff0c;对筛选与剔除前、后的数据分别绘制若干直方图&#xff…