【数据结构】Map的使用与注意事项

文章目录

  • 概念
  • 模型
  • Map 的使用
    • put() 和 get()
    • getOrDefault()
    • remove()
    • keySet()
    • entrySet()
  • 注意事项

概念

Mapset 是一种专门用来进行搜索的容器或者数据结构,其搜索的效率与其具体的实例化子类有关。 以前常见的搜索方式有:

  1. 直接遍历,时间复杂度为 O ( N ) O(N) O(N),元素如果比较多效率会非常慢
  2. 二分查找,时间复杂度为 O ( l o g N ) O(logN) O(logN),但搜索前必须要求序列是有序的

上述排序比较适合静态类型的查找,即一般不会对区间进行插入和删除操作了,而现实中的查找比如:

  1. 根据姓名查询考试成绩
  2. 通讯录,即根据姓名查询联系方式
  3. 不重复集合,即需要先搜索关键字是否已经在集合中

可能在查找时进行一些插入和删除的操作,即动态查找,那上述两种方式就不太适合了,本节介绍的 MapSet 是一种适合动态查找的集合容器。

模型

一般把搜索的数据称为关键字(Key),和关键字对应的称为值(Value),将其称之为 Key-value 的键值对,所以模型会有两种:

  1. key 模型,比如:

    • 有一个英文词典,快速查找一个单词是否在词典中
    • 快速查找某个名字在不在通讯录中
  2. Key-Value 模型,比如:

    • 统计文件中每个单词出现的次数,统计结果是每个单词都有与其对应的次数:<单词,单词出现的次数>
    • 梁山好汉的江湖绰号:每个好汉都有自己的江湖绰号

Map 中存储的就是 key-value 的键值对,Set 中只存储了 Key

Map 的使用

image.png
MapSet 主要用于搜索

  • TreeSetTreeMap 底层就是一颗二叉搜索树==>红黑树
方法解释
V get(Object key)返回 key 对应的 value
V getOrDefault(Object key, V defaultValue)返回 key 对应的 value,key 不存在,返回默认值
V put(K key, V value)设置 key 对应的 value
V remove(Object key)删除 key 对应的映射关系
Set keySet()返回所有 key 的不重复集合
Collection values()返回所有 value 的可重复集合
Set> entrySet()返回所有的 key-value 映射关系
boolean containsKey(Object key)判断是否包含 key
boolean containsValue(Object value)判断是否包含 value

put() 和 get()

Map<String,String> map = new TreeMap<>();  
map.put("及时雨","松江");  
map.put("齐天大圣","孙悟空");  String val = map.get("齐天大圣");  
String val2 = map.get("孙悟空");  
System.out.println(val);  
System.out.println(val2);/*
运行结果:
孙悟空
null
*/
  • put 的时候是有顺序的,前面的是 Key ,后面的是 Value
  • 进行 get 的时候是返回 Key 所对应的 Value,而不能返回 Value 所对应的 Key

getOrDefault()

当没有找到 Key 所对应的 Value 值时,会默认输出 null,但默认值可以改

Map<String,String> map = new TreeMap<>();  
map.put("及时雨","松江");  
map.put("齐天大圣","孙悟空");  String val3 = map.getOrDefault("弼马温","没找到啊");  
System.out.println(val3);/*
运行结果:
没找到啊
*/
  • 如果没有“弼马温”这个 Key,就取不到 Value,就给一个默认值“没找到啊

remove()

就是删除的意思,删除 Key 对应的映射关系

Map<String,String> map = new TreeMap<>();  
map.put("及时雨","松江");  
map.put("齐天大圣","孙悟空");  String val3 = map.remove("齐天大圣");  
System.out.println(val3);String val4 = map.get("齐天大圣");
System.out.println(val4);/*
运行结果:
孙悟空
null
*/
  • 因为这个方法的返回值是 Value,所以还是会打印出“孙悟空”,但之后 Key(齐天大圣)和 Value(孙悟空)之间的映射关系就被删除了,不存在了
  • 所以第二次再 get 这个 KeyValue 值就找不到了

keySet()

将所有的 Key 都拿出来,放在一个 Set 集合中

Map<String,String> map = new TreeMap<>();  
map.put("及时雨","松江");  
map.put("齐天大圣","孙悟空");  	
map.put("齐天大圣","弼马温");Set<String> set = map.keySet();  
System.out.println(set);
System.out.println(map.get("齐天大圣"));/*
运行结果:
[及时雨, 齐天大圣]
弼马温
*/
  • 因为 Key 都是 String,所以用一个 String 类型的 Set 进行接收
  • Key 是不能重复的,如果重复了,就会更新 Key 的值

entrySet()

如果想将 KeyValue 的映射关系一起返回,就可以调用 entrySet

Map<String,String> map = new TreeMap<>();  
map.put("及时雨","松江");  
map.put("齐天大圣","孙悟空");  Set<Map.Entry<String,String>> entries = map.entrySet();  
System.out.println(entries);
System.out.println(===============);for (Map.Entry<String,String> entry : entries){  System.out.println(entry);  
}
System.out.println(===============);for (Map.Entry<String,String> entry : entries){  System.out.println("Key:"+entry.getKey()+" Value:"+entry.getValue());  
}/*
运行结果:
[及时雨=松江, 齐天大圣=孙悟空]
===============
及时雨=松江
齐天大圣=孙悟空
===============
Key:及时雨 Value:松江
Key:齐天大圣 Value:孙悟空
*/
  • Entry 里面也可以单独的取出 Key 或者 Value
  • EntryMap 接口的内置接口,其内部有
    • getKey 方法,用来获取 Key
    • getValue 方法,用来获取 Value
    • setValue 方法,用来更新 Value

注意事项

  1. Map 是一个接口,不能直接实例化对象,如果要实例化对象只能实例化其实现类 TreeMap 或者 HashMap (搜索树,红黑树)

  2. Map 中存放键值对的 Key 是唯一的,value 是可以重复的

  3. TreeMap 中插入键值对时,key 不能为空,否则就会抛 NullPointerException 异常,value 可以为空。但是 HashMapkeyvalue 都可以为空。

  4. Map 中的 Key 可以全部分离出来,存储到 Set 中来进行访问(因为 Key 不能重复)。

  5. Map 中的 value 可以全部分离出来,存储在 Collection 的任何一个子集合中(value 可能有重复)。

  6. Map 中键值对的 Key 不能直接修改,value 可以修改,如果要修改 key,只能先将该 key 删除掉,然后再来进行重新插入。

  7. TreeMap 中存储元素的时候,Key 一定是要可以比较的,因为 Key 的底层是红黑树,要将 Key 按大小顺序排列好。如果你传入一个类的时候,就要注意了

Map 底层结构TreeMapHashMap
底层结构红黑树哈希桶
插入/删除/查找时间复杂度 O ( l o g N ) O(logN) O(logN) O ( 1 ) O(1) O(1)
是否有序关于Key有序无序
线程安全不安全不安全
插入/删除/查找区别需要进行元素比较通过哈希函数计算哈希地址
比较与覆写key必须能够比较,否则会抛出

ClassCastException异常
自定义类型需要覆写equals和

hashCode方法
应用场景需要Key有序场景下Key是否有序不关心,需要更高的 时间性能

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

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

相关文章

URP简洁的instance的写法

材质还是要开启enable instance&#xff0c;这是上一次的写法 https://dbbh666.blog.csdn.net/article/details/136644181 最近发现更适合我个人的习惯的写法 就是代码控制这个整个过程 C#代码是这样的&#xff0c;获取一个mesh&#xff0c;获取每个mesh的transform&#xff0c…

常见的性能测试方法!

前言 性能测试划分有很多种&#xff0c;测试方法也有很多种&#xff0c;更确切的说是由于测试方法的不同决定了测试划分的情况&#xff0c;但在测试过程中性能测试的划分没有绝对的界限&#xff0c;常用的有压力测试、负载测试和并发用户测试等。 性能测试的方法主要包括以下…

stm32之硬件I2C读写MPU6050陀螺仪、加速度传感器应用案例

系列文章目录 1. stm32之I2C通信协议 2. stm32之软件I2C读写MPU6050陀螺仪、加速度传感器应用案例 3. stm32之I2C通信外设 文章目录 系列文章目录前言一、电路接线图二、应用案例代码三、应用案例分析3.1 基本思路3.2 相关库函数介绍3.3 MPU6050模块3.1.1 模块初始化3.1.2 指定…

52 mysql 启动过程中常见的相关报错信息

前言 我们这里主要是看一下 service mysql start, service mysql stop 的过程中的一些常见的错误问题 这些 也是之前经常碰到, 但是 每次都是 去搜索, 尝试 1, 2, 3, 4 去解决问题 但是 从来未曾思考过 这个问题到底是 怎么造成的 The server quit without updating PID fil…

vrrp协议,主备路由器的选举

当VRRP备份组中的所有备份路由器&#xff08;BACKUP&#xff09;具有相同的优先级时&#xff0c;选举新的主路由器&#xff08;MASTER&#xff09;的过程将基于以下规则&#xff1a; IP地址优先&#xff1a;如果备份路由器的优先级相同&#xff0c;那么具有最高IP地址的路由器…

我的sql我做主!Mysql 的集群架构详解之组从复制、半同步模式、MGR、Mysql路由和MHA管理集群组

目录 Mysql 集群技术一、Mysql 在服务器中的部署方法1.1 在Linux下部署mysql1.1.1 安装依赖性&#xff1a;1.1.2 下载并解压源码包1.1.3 源码编译安装mysql1.1.4 部署mysql 二、Mysql的组从复制2.1 配置mastesr2.2 配置salve2.3 当有数据时添加slave22.4 延迟复制2.5 慢查询日志…

Python爬虫02

xml 和html 区别 jsonpath模块 场景 多层嵌套的复杂字典直接提取数据 安装 pip install jsonpath使用 from jsonpath import jsonpathret jsonpath(dict, jaonpath语法规则字符串)语法规则 eg: lxml模块&xpath语法 谷歌浏览器 xpath helper 插件 作用对当前页面…

HIS系统|HIS系统开发源码

在数字医疗时代&#xff0c;医院信息系统&#xff08;HIS&#xff09;的开发至关重要。本文将深入探讨在开发HIS系统时需要关注的主要事项&#xff0c;从系统架构到数据安全&#xff0c;为医疗机构提供实用的开发指南。 1、需求分析与系统规划 在开发HIS系统的初期&#xff0c…

HTML5手机端通用网站模板源码

文章目录 1.设计来源1.1 主界面1.2 文章信息界面1.3 文章列表界面1.4 双列文章列表界面1.5 通用标签界面1.6 联系我界面1.7 折叠框标签界面1.8 相关界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作…

UE 【材质编辑】自定义ShadingMode

【UE 4.27.2】 在UE中提供了多种多样的ShadingMode&#xff0c;相当于一种风格化的处理方案(整体全面的流程调整)&#xff0c;切换ShadingMode可以看到不同的显示效果&#xff1a; 通过简单的拓展&#xff0c;我们可以实现自定义的ShadingMode&#xff0c;使得我们切换到自己的…

DevOps学习笔记

记录以下DevOps学习笔记&#xff0c;这里是笔记的入口汇总&#xff0c;可以直观的看到所有的笔记&#xff0c;还没有入口的部分&#xff0c;在下正在努力编写中。 gitlab jenkins docker docker安装 artifactory 1.artifactory安装 2.artifactory使用 计算机网络 1.dn…

MySQL:约束

目录 一、概述二、创建测试三、外键约束3.1 数据准备3.2 添加外键3.3 删除外键3.4 增加外键约束 一、概述 约束主要用于作用在表中字段上的规则&#xff0c;用于限制存储在表中的数据。 保证数据库中数据的正确性、有效性和完整性。 约束描述关键字主键约束非空并且唯一PRIMARY…

【Vue】Echart渲染数据时页面不显示内容

背景 做的一个对话交互的功能&#xff0c;根据后台返回的数据&#xff0c;渲染成Echart图表展示因为图表种类多&#xff0c;因此根据不同图表单独做了一个个vue组件&#xff0c;将数据根据展示类型传到这些子组件中进行渲染无论哪种图表&#xff0c;第一次展示时都能正常展示&…

【Threejs学习】材质灯光投影

一、光源分类 环境光(AmbientLight)&#xff1a;会均匀的照亮场景中的所有物体。无方向&#xff0c;不能投射阴影。平行光(DirectionalLight)&#xff1a;沿特定方向散发的光&#xff0c;发出的光线都是平行的。例如太阳光&#xff0c;可投射阴影。点光源(PointLight)&#xf…

基础闯关5

一、XTuner简介 XTuner 是一个高效、灵活、全能的轻量化大模型微调工具库。 高效 支持大语言模型 LLM、多模态图文模型 VLM 的预训练及轻量级微调。XTuner 支持在 8GB 显存下微调 7B 模型&#xff0c;同时也支持多节点跨设备微调更大尺度模型&#xff08;70B&#xff09;。自…

足球大小球预测及足球大数据之机器学习预测大小球

足球运动是当今世界上开展最广、影响最大、最具魅力、拥有球迷数最多的体育项目之一&#xff0c;尤其是欧洲足球&#xff0c;每年赛事除了五大联赛&#xff08;英超、西甲、德甲、法甲、意甲&#xff09;之外&#xff0c;还会有欧冠&#xff08;欧洲冠军联赛&#xff09;&#…

chapter10-OOP高级部分——(静态内部类)——day14

422-静态内部类1 423-静态内部类2 424-内部类测试 输出两个5 我亦无他&#xff0c;唯手熟尔

mfc140u.dll丢失的解决方法都有哪些?有效的将丢失的mfc140u.dll恢复

在使用基于Windows系统的电脑运行某些应用程序时&#xff0c;可能会遇到一个提示错误&#xff1a;“mfc140u.dll文件丢失”。这通常意味着你的系统缺少某个必要的动态链接库&#xff08;DLL&#xff09;文件&#xff0c;这可能会阻止程序正常运行。本文将向你介绍一系列有效的解…

腾讯云Linux服务器运维,安装JDK、rabbitmq、nginx、Redis、ClickHouse

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; CODING 代码托管目录 1、…

elasticsearch的docker方式安装及golang1.22版本使用elasticsearch7的示例代码

1.准备linux服务器,ip地址为192.168.137.116 2.安装docker-ce yum -y install docker-ce 配置docker镜像 vim /etc/docker/daemon.json{"registry-mirrors": ["https://harbor:443", "https://985ecq8w.mirror.aliyuncs.com","https://…