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

news/2024/11/29 9:56:11/

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.ppmy.cn/news/1587.html

相关文章

jsp儿童网站系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 jsp 儿童网站系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开 发&#xff0c;数据库为Mysql&#xff0c;使用ja…

Java实验七

文章目录前言一、判断E盘指定目录下是否有后缀名为.jpg的文件&#xff0c;如果有就输出此文件名称。二、分别使用字节流和字节缓冲流的两种读取方式实现对图片文件的复制操作并比较两种方式在复制时间上的效率。三、编写一个程序&#xff0c;分别使用转换流、字符流和缓冲字符流…

Linux开发常用ps命令选项详解

【摘要】本文介绍了在Linux应用/内核开发调试中&#xff0c;经常需要用到的两个选项组合&#xff0c;当然&#xff0c;如果你需要查看更多更详尽的选项说明&#xff0c;可以参考man说明文档&#xff0c;即命令行下输入man ps进行查看。 aux选项组合 使用场景&#xff1a;更多…

uImage的制作过程详解

1、uImage镜像介绍 参考博客&#xff1a;《vmlinuz/vmlinux、Image、zImage与uImage的区别》&#xff1b; 2、uImage镜像的制作 2.1、mkimage工具介绍 参考博客&#xff1a;《uImage的制作工具mkimage详解(源码编译、使用方法、添加的头解析、uImage的制作)》&#xff1b; 2.2…

MySQL日志管理、备份与恢复

一.MySQL 日志管理 MySQL 的日志默认保存位置为 /usr/local/mysql/data MySQL 的日志配置文件为/etc/my.cnf &#xff0c;里面有个[mysqld]项 修改配置文件&#xff1a; vim /etc/my.cnf [mysqld] 1、错误日志 错误日志&#xff0c;用来记录当MySQL启动、停止或运行时发生…

简洁自增ID实现方案

简介 从数据库性能角度考虑&#xff0c;我们经常需要数字型的自增主键&#xff0c;有时候我们并不想用像MySQL自带的自增&#xff0c;因为从1开始很数据位数不一样&#xff0c;对有点强迫症的人来说&#xff0c;不是很友好。 另外&#xff0c;别人也容易根据这种从1开始的自增…

C语言Socket编程,实现两个程序间的通信

文章目录server和client通信流程图实现两个程序间的通信1.服务端server2.客户端client3.怎么运行呢&#xff1f;4.重写代码已剪辑自: https://www.cnblogs.com/fisherss/p/12085123.html server和client通信流程图 在mooc上找到的,使用Socket客户端client和服务端server通信的…

Linux简单命令

Linux简单命令 现在写几个使用Linux时最常使用的简单命令 1.将一个文件复制到另一个文件夹内&#xff0c;比如将backboneA复制到backboneB路径下&#xff1a; cp -r /文件夹路径backboneA/* /文件夹路径backboneB/2.查看当前目录下有多少个文件及文件夹&#xff0c;需在终端输…