秒懂数据结构之Map _ Set ,竟如此简单

news2024/9/22 1:28:47

Map、Set

文章目录

  • 前言
  • 一、Map、Set的初步理解
  • 二、Map、Set的CURD方法的实现
  • 三、Map、Set的遍历
  • 总结


前言

  • Set和Map天然就是高效搜索/查找的语义
  • 在这里我为什么将这两个集合分别列举比较呢?
  • 希望通过我的这篇博客可以增进大家对Map和Set的认识!

一、Map、Set的初步理解

1.Map

  • 一次保存一个键值对对象(key==value)=>这种映射对象
  • 常见的两个子类:HashMap:基于哈希表(数组+链表的实现)

                                   TreeMap:基于二分搜索平衡树(红黑树的实现)

  • 核心的应用场景:高效的搜索,存储的是key-value键值对,若需要根据不重复的key去查找value的内容,使用Map集合

2.Set

  • 保存单个不重复元素的集合,若某些场景下,只是判定某个Key值是否存在,使用Set,如:手机通化录,查找某个人名是否存在
  • Set集合所有的元素都是唯一不重复的,Set集合只能保存单个元素
  • 常见的两个子类:HashSet 

                                    TreeSet

二、Map、Set的CURD方法的实现

1.Map

  • add、update (添加和修改)

元素的添加和更新操作都是同一个方法, 将键值对key和value保存到当前的Map集合中

  

 

  1. 因为在Map集合中,key不能重复,若put时,发现key重复,则会将当前Map集合中对应的value值更新为此时的put的value值

  2. value可以重复
  3. 在Map集合中,键值对之间是无序的,元素的保存顺序和添加顺序无关
  4. 关于Map集合中保存null值:

               HashMap部分: key和value可以为null,key值唯一,只能存在一个null值的key

 

               TreeMap部分:key不可为空,value可为空,元素的添加顺序也为乱序(在TreeMap中key不可为空,且key必须实现Comparable接口或者通过TreeMap的构造方法传入比较器对象)               =>        换句话说:保存在TreMap中的key必须是可比较的,因为它的结构是一个搜索树结构(左子树<根节点,根节点<右子树)

乱序 且 value可为空

键为空时
键为空时,会出现空指针异常

5.在Map集合中元素的添加顺序和保存顺序相同的子类

LinkedHashMap : 相当于给普通的HashMap加了一个链表,这个链表就保存了元素的添加顺序key和value可以为null(可以改造LinkeddHashMap做LRU缓存) 

  • get(搜索查询特定的值) 

根据key值搜索对应的value值,若没有对应的key值,返回null

 根据key值搜索Map中对应的value值,若没找到,返回默认值defaultvalue(此方法经常和map.put方法搭配使用,简化代码逻辑,多用于解决重复元素出现统计次数问题

map.put(i,map.getOrDefault(i,0) + 1);

1.map中存在key值为i的value,返回value
2.不存在value对应的key值,返回0

  •  contain (查询元素是否存在)

boolean containsKey(K key):在当前Map集合中是否包含指定的key值

boolean containsValue(V value):在当前Map集合中是否包含指定的value值 

  • remove(删除Map中指定的key和value)

 

 remove(Object key) 删除key值对应的键值对对象,返回删除之前的value值

remove(Object key,Object value)删除指定的key以及对应的value值对象,返回是否删除成功

 clear()慎用!所有元素全部删除,多用于提桶跑路!

size=0!

2.Set

  • add(添加)

boolean add(E e)向当前Set集合中添加一个新的元素e,若e不存在则成功添加,返回true。若e存在,添加失败,返回false(因此可以方便的使用Set集合的add做去重处理

  • remove(删除指定元素o)

 boolean remove(Object o)

删除指定元素o

  • contains(查询)

boolean contains(Object o)

查询当前Set集合中是否包含元素o

  • 在Set集合中没有提供元素的修改方法,只能将这个元素删了,再添加新值

三、Map、Set的遍历

1.Map

  • Map集合的遍历比较低效,for-each循环只能用于Iterable接口及其子类,由图可知,Map集合和Iterable接口毫无关系!


所以,要想进行Map集合的遍历,必须先进行将Map转为Set集合

在Map源码中,我们可以发现,里面有一个内部类的同时,还有一个内部接口

Map接口存储键值对对象时,内部存储的都是一个个Map.Entry对象 ,即:将Map对象转换成Set对象,Set对象的内部就存储在Map的一个个键值对Entry对象,转为Set对象之后就可以方便的使用for-each循环进行遍历,其中的每个元素就是Map的Entry对象(Map.Entry这个接口是map接口的内部接口) 

将Map集合转为Set集合entrySet,Set集合就保存一个个Map.Entry对象

  •  补充Map的一个方法

 

 keySet()    取出当前Map集合中所有的Key值,返回类型为Set

values()    取出当前Map集合中所有的value值,返回值类型为Collection

 2.Set

for-each 循环即可,此处不再赘述

总结

Set集合和Map集合的关系:

Set集合是保存单个不重复元素的集合,Map是保存一对键值对对象的集合。

Set的常用子类如HashSet、TreeSet,内部使用的是对应的Map对象。

HashSet元素就在HashMap的key上存储

TreeSet元素就在TreeMap的key上存储。

在源码中,内部将元素放在Map的key上,所有的value都是一个相同的空的Object对象

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

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

相关文章

[附源码]Python计算机毕业设计Django汽车美容店管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

计算卫星高度角、方位角

最小二乘定权、电离层对流层改正&#xff0c;都需要卫星的高度角、方位角。本章将介绍求解完卫星的地固坐标系的位置后&#xff0c;如何求解卫星的高度角、方位角。 卫星位置求解请参考之前的博客&#xff1a;卫星位置解算原理与程序设计 参考书籍&#xff1a;黄丁发&#xff0…

读<算法图解><笔记摘录>

从很多途径当中,看到过这本书的知识点,是一本很有趣的算法入门书籍,最近花费了几天的时间将其阅读完,总想着总结一下这本书的算法知识点,分享给大家,也让自己掌握地更加踏实一点. 算法:一组完成任何任务的指令 算法这玩意,在保证满足条件,并且不浪费内存的情况下,要尽可能速度…

18.定位元素练习-淘宝网

注意&#xff1a; 如果一个盒子定位元素属性既有left又有right,则会执行left属性。 既有top又有bottom&#xff0c;会执行top <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compa…

五子棋游戏AI智能算法设计

五子棋游戏C语言AI智能算法设计 近来发现编制五子棋游戏很有趣&#xff0c;尤其是AI智能算法很烧脑。网上介绍有什么贪心算法&#xff0c;剪枝算法&#xff0c;博弈树算法等等&#xff0c;不一而足。 对于人机对战的电脑智能应子算法&#xff0c;参阅很多五子棋书籍棋谱和五…

有序Map集合:LinkedHashMap和TreeMap该如何选用

文章目录前言一、为什么HashMap是无序的二、LinkedHashMap如何保证有序性三、TreeMap的底层原理四、LinkedHashMap和TreeMap比较总结前言 为什么HashMap是无序的&#xff1f;有序的Map集合有哪些&#xff1f;LinkedHashMap和TreeMap都是有序的Map集合&#xff0c;他们有什么区…

智能优化算法期末复习(更新ing)

目录 一、GA遗传算法 二、ACO蚁群算法 三、PSO粒子群算法 四、SA模拟退火算法 五、ABC人工蜂群算法 六、综合 一、GA遗传算法 1.运算流程 2.遗传算法适应值分配策略&#xff08;基于目标函数的直接分配、基于排名的分配&#xff09; 3.遗传算法在二进制问题&#xff08;如0…

Windows OpenGL ES 图像绿幕抠图

目录 一.OpenGL ES 图像绿幕抠图 1.原始图片2.效果演示 二.OpenGL ES 图像绿幕抠图源码下载三.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 特效 零基础…

Java开发必须掌握的运维知识 (十)-- Docker集群自动化部署管理:Kubernetes快速入门

一、什么是Kubernetes Kubernetes(K8S)是Google在2014年发布的一个开源项目&#xff0c;用于自动化容器化应用程序的部署、扩展和管理。 Kubernetes通常结合docker容器工作&#xff0c;并且整合多个运行着docker容器的主机集群。 Kubernetes官网地址 二、Kubernetes相关特性 …

JavaWeb_第3章_HTTPTomcatServlet

JavaWeb_第3章_HTTP&Tomcat&Servlet 文章目录JavaWeb_第3章_HTTP&Tomcat&Servlet1&#xff0c;Web概述1.1 Web和JavaWeb的概念1.2 JavaWeb技术栈1.2.1 B/S架构1.2.2 静态资源1.2.3 动态资源1.2.4 数据库1.2.5 HTTP协议1.2.6 Web服务器1.3 Web核心课程安排2, HT…

vue中,页面布局之使用vue-splitpane实现窗格的拆分和调节,类似于flex布局

vue中&#xff0c;页面布局之使用vue-splitpane实现窗格的拆分和调节&#xff0c;类似于flex布局 1、基本介绍 npm地址&#xff1a;https://www.npmjs.com/package/vue-splitpane 安包 npm install vue-splitpane注册 main.js import splitPane from vue-splitpane // 注…

土豆清洗去皮机设计

目 录 摘 要 I Abstract II 1绪论 1 1.1选题背景及意义 1 1.2国内外研究现状 1 1.2.1国内外现状 2 1.2.2国外研究现状 2 1.3 发展趋势 3 1.4研究内容及方法 4 2毛刷式土豆清洗去皮机总体设计 5 2.1毛刷式土豆清洗去皮机的构造及工作原理 5 2.2 土豆擦皮机的相关计算 6 2.2.1设计…

动手学深度学习(1)—— 基础知识

文章目录一、基本概念1.1 关键组件数据模型目标函数优化算法1.2 各种机器学习问题监督学习无监督学习强化学习1.3 神经网络的特点二、预备知识2.1 数据操作入门运算符广播机制索引和切片节省内存转换为其他python 对象2.2 数据预处理读取数据集处理缺失的数据2.3 线性代数标量向…

WPS通过“文档部件”的“域”设置图、表和公式的自动序列号

写文档时&#xff0c;当有多张图片、多个表格和多个公式需要编号时&#xff0c;可以通过设置自动序列号&#xff0c;实现一定程度的自动编号和任意位置插入后随时更新序号。具体操作如下 ​ 1. 图的设置 在WPS中&#xff0c;首先设置好一张图片的格式后&#xff0c;对于需要设…

【并发】J.U.C线程池

线程池 经历了Java内存模型、JUC基础之AQS、CAS、Lock、并发工具类、并发容器、阻塞队列、atomic类后&#xff0c;我们开始JUC的最后一部分&#xff1a;线程池。 线程池的优势 为什么多线程会带来性能问题 多线程的性能问题&#xff0c;分为两类&#xff0c;一类是线程本身…

从今天起真正释放创造力——亚马逊云科技re:Invent

对于开发者而言&#xff0c;成就感来自于每一次敲下代码后可实现的创造力&#xff0c;而不是把时间和精力消耗在写千篇一律又无法复用的“胶水”代码&#xff0c;或是在越来越复杂的软件栈面前&#xff0c;疲惫地写业务流程并尽量减少Bug。更加不堪的是&#xff0c;有时仅仅是因…

2022.12.4 学习周报

文章目录摘要文献阅读1.题目2.摘要3.介绍4.方法5.实验5.1 数据集5.2 网络模型5.3 实验表现6.展望深度学习1.LSTM原理1.1 什么是LSTM&#xff1f;1.2 遗忘门&#xff08;forget gate&#xff09;1.3 输入门&#xff08;input gate&#xff09;1.4 输出门&#xff08;output gate…

Python声明式统计可视化库 altair-GitHub鉴赏官

推荐理由&#xff1a;Vega-Altair是 Python 的声明式统计可视化库。借助 Vega-Altair&#xff0c;您可以花更多时间来理解数据及其含义。Vega-Altair 的 API 简单、友好且一致&#xff0c;建立在强大的 Vega-Lite JSON 规范之上。这种优雅的简单性可以用最少的代码产生漂亮而有…

FT2004(D2000)开发实战之在线开发GPIO LED程序

一 在线开发GPIO LED程序 分析GPIO LED原理图 从飞腾FT2004原理图可知,开发板将GPIO1_A3和GPIO1_A4连接到LED上,具体如下: 开发板将GPIO1_A3和GPIO1_A4连接到LED上,因此代码初始化时需要注意以下几点: => 打开/dev/gpiochip1设备 => gpio偏移量为3和4创建led.c roo…

OpenShift 4 - 从 FreeIPA/RHIdM 向 RHSSO 同步用户和组

《OpenShift / RHEL / DevSecOps / Ansible 汇总目录》 说明&#xff1a;本文已经在 OpenShift 4.11 环境中验证 文章目录安装 FreeIPA/RHIdM在 FreeIPA/RHIdM 中添加用户和组从 FreeIPA/RHIdM 向 RHSSO 同步用户和组参考红帽 RHIdM 基于开源项目 FreeIPA&#xff0c;其内部提供…