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

news2024/11/13 15:13:14

文章目录

  • 概念
  • 模型
  • 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.coloradmin.cn/o/2099072.html

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

相关文章

Spring AOP(下)原理

本文我们来学习 Spring AOP 的原理&#xff0c;也就是 Spring 是如何实现 AOP 的。Spring AOP 是基于动态代理来实现 AOP 的&#xff1b; 1. 代理模式 1.1 代理弄模式的定义 代理模式&#xff0c;也叫委托模式。 定义&#xff1a;为其他对象提供一种代理以控制这个对象的访问…

【第三版 系统集成项目管理工程师】第14章 收尾过程组

持续更新。。。。。。。。。。。。。。。 【第三版】第十四章 收尾过程组 14.1结束项目或阶段14.1.1主要输入1.项目章程-P5392.项目管理计划-P5393.项目文件-P5394.验收的可交付成果-P5405.协议-P5406.采购文档-P540 14.1.2主要输出1.最终产品、服务或成果-P5402.项目最终报告…

如何在IntelliJ IDEA中将Tab设置为4个空格

前言 IntelliJ IDEA是一个强大的开发工具&#xff0c;支持多种编程语言。为了保持代码整洁一致&#xff0c;开发者经常需要调整编辑器中的Tab和缩进设置。 步骤1: 打开设置 首先&#xff0c;启动IntelliJ IDEA。在主界面上方的菜单栏中找到 File&#xff08;文件&#xff09…

体育直播平台开发:初创公司突破资金与市场的双重挑战

在当今竞争激烈的数字娱乐行业中&#xff0c;体育直播平台的发展潜力巨大。然而&#xff0c;面对如此巨大的蓝海市场&#xff0c;对于初创公司或中小型平台而言&#xff0c;高昂的开发和运营成本可能成为进入该行业的主要障碍。本文将探讨一些可行的低成本开发策略&#xff0c;…

Matlab三维图的坐标轴标签 自动平行坐标/自动旋转

下载解压工具包&#xff1a; https://www.mathworks.com/matlabcentral/fileexchange/49542-phymhan-matlab-axis-label-alignment 添加至MATLAB路径: 在三维绘图后增加下列语句即可 ax struct(Axes, gca); align_axislabel([],ax) h3d rotate3d; set(h3d,ActionPreCa…

k8s项目的发布(金丝雀发布)

目录 三种发布方式 1.蓝绿发布 2.金丝雀发布&#xff08;灰度发布&#xff09; 实验&#xff1a;k8s实现金丝雀发布 3.滚动发布&#xff08;默认形式&#xff09; 因为应用升级以及新旧业务切换&#xff0c;所以在这个过程当中如何保证对外的服务正常是一个非常重要的问题…

/单元测试

承接上文 统一异常处理&#xff0c;封装结果-CSDN博客 ******************************************** 登录业务 Service public class EmployeeServiceImpl extends ServiceImpl<EmployeeMapper, Employee> implements EmployeeService {Resourceprivate JwtUtils j…

深入探索批处理中的变量与命令:从基础到高级

更多内容前往&#xff1a;孔乙己大叔 在Windows环境中&#xff0c;批处理&#xff08;Batch&#xff09;文件是一种非常有用的脚本工具&#xff0c;允许用户自动化重复性任务。通过编写批处理脚本&#xff0c;用户可以执行一系列命令&#xff0c;而无需手动输入每个命令。变量是…

怎么把视频压缩变小?快码住这篇视频压缩教程

众所周知&#xff0c;视频已经成为人们交流信息的重要方式之一。 然而&#xff0c;随着视频分辨率越来越高&#xff0c;文件大小也随之膨胀&#xff0c;这给存储空间带来了不小的压力&#xff0c;同时也影响了视频在网络上的传输速度。 因此&#xff0c;掌握视频压缩技巧&…

E1.S接口如何解决SSD过热问题?

针对SSD接口标准&#xff0c;目前业内有两大组织&#xff1a; PCI-SIG&#xff1a;这个就是定义pcie协议标准的那个组织&#xff0c;我们常见的传统接口M.2, U.2, 2.5英寸的接口都归这个组织定义规范。M.2&#xff0c;U.2起源与客户端&#xff0c;也是企业级当前最常用的接口形…

Day22_K8S

文章目录 3.资源管理方式通过命令管理通过配置文件管理4. 基本概念入门4.1 Namespace4.2 Pod4.3 Label4.4 Deployment4.5 Service5. Pod详解5.1 Pod介绍5.2 Pod配置5.3 Pod生命周期5.3.1 初始化容器5.3.2 钩子函数5.3.3 容器探测5.3.4 重启策略5.4 Pod调度5.4.1 定向调度5.4.2 …

【技巧】Excel检查单元格的值是否在另一列中

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 用到的excel函数 IF(ISNUMBER(MATCH(H2, I2:I10, 0)), H2, "") 注意改上面的“H2、I2、I10”&#xff01; 函数效果 函数解释 检查单元格 …

简述二叉树先序遍历、中序遍历和后序遍历的思想。

先序遍历&#xff08;根左右&#xff09;(DLR) 若二叉树为空&#xff0c;则退出&#xff0c;否则进行下面操作:访问根结点、先序遍历左子树、先序遍历右子树。 中序遍历&#xff08;左根右&#xff09;(LDR) 若二叉树为空&#xff0c;则退出&#xff0c;否则进行下面操作:中…

Nginx: 配置文件重载的原理和热部署

配置文件的重载原理 我们可以通过给Nginx的master进程发送 HUP 信号, 或者是使用Nginx的二进制程序 执行 reload命令来重新载入配置文件, 从而实现Nginx的一个平滑升级对Nginx的背后到底是发生了一个什么样的事情去保证新老配置的平滑过渡的 reload 重载配置文件的流程 第一步…

Amazon SPAPI Deloitte(德勤)审计问题流程

作为Amazon开发者审计的一部分&#xff0c;亚马逊会对使用其API的开发者进行严格的审核和评估。 这个过程旨在确保开发者遵守亚马逊的各项政策和安全要求&#xff0c;特别是在处理个人身份信息&#xff08;PII&#xff09;和其他敏感数据时。 下面是一些关于亚马逊开发者审计的…

【Python 千题 —— 算法篇】逆序字符串

Python 千题持续更新中 …… 脑图地址 👉:⭐https://twilight-fanyi.gitee.io/mind-map/Python千题.html⭐ 题目背景 字符串操作在编程中非常常见,无论是数据处理、文本分析还是算法设计,字符串的处理都是基础且关键的一部分。尤其是在数据处理和编程竞赛中,字符串逆序是…

常见错误

常见错误 报错&#xff1a;TypeError: setUpClass() missing 1 required positional argument: ‘cls’ 解决办法如上图 报错&#xff1a;TypeError: a bytes-like object is required, not ‘str’ ###报错&#xff1a;ERROR: usage: pytest [options][file_or_dir] [file_or_…

三(五)子棋实现

设计一个小游戏其实是对自己掌握一门编程语言的一个升华&#xff0c;几百行代码分项目进行这种很让人着迷的感觉哦&#xff01; 与五子棋游戏其实本质区别只不过是判输赢的条件不同&#xff0c;这里我打算写写三子棋小游戏。 代码的最后我将所有源代码整理了&#xff0c;大家急…

【C++ Primer Plus习题】8.2

问题: 解答: #include <iostream> using namespace std;typedef struct _CandyBar {string brand;float weight;int hot; }CandyBar;void fill(CandyBar& cb, const char* name"Millennium Munch", double w2.85, int h350) {cb.brand name;cb.weight w…

2222. 分糖果(candy)

代码 #include <bits/stdc.h> using namespace std; int main(){int n, l, r;cin>>n>>l>>r;cout<<(l/nr/n?r%n:n-1);return 0; } 记得点赞关注收藏&#xff01;&#xff01;&#xff01;谢谢&#xff01;&#xff01;&#xff01;