当前位置: 首页 > news >正文

【数据结构】MapSet

【概念】

Map和Set是一种专门用于搜索的数据结构,其搜索效率与具体实例化的子类数量有关,本质上是一颗二叉搜索树 

搜索的关键数据为关键字“Key”,关键字对应的数据为值“Value”,将其称为“Key-Value键值对”

【关于Map】

Map是一个接口类,该类没有继承至Collection,该类中存储的是<K,V>结构的键值对,且K一定是唯一的,不可重复

【关于Map.Entry<K,V>】

Map.Entry<K,V>是Map内部实现的,用于存放<K,V>键值对之间映射关系的内部类

为什么有Entry?

在Java源码中,Map的接口中又定义了一个内部接口Entry

【关于Map的常用方法】

【实例化Map】

Map<String,String> map = new TreeMap<>();

Map是一个接口,因此它不能去直接实例化,只能去new两个实现类,一个TreeMap,一个HashMap,这里放的TreeMap就是一个二叉搜索树

 【设置key对应的value】

Map.put("及时雨", "宋江");
Map.put("齐天大圣", "孙悟空“);

这里设置了两个K和V的键值对,都是一一对应的关系

 【获取key对应的value】

String val = map.get("齐天大圣");
System.out.println(val);

该图中value值是一个String,所以需要通过String来进行接收,该图中输出“孙悟空”

但如果get中填写的是“齐天大圣2”这样在Map中对应key没有value的值时,会返回一个null

 【返回key对应的value,key若不存在,则返回默认值】

String val2 = map.getOrDefault("齐天大圣2","haha");
System.out.println(val2);

原代码中不存在“齐天大圣2”这个key,因此返回一个自定义默认值“haha”

 【删除key对应的value】

String val3 = map.remove("齐天大圣");
System.out.println(val3);

删除了“齐天大圣”这个key,返回其value的同时删除key映射关系

 【返回所有key的不重复集合】

Set<String> set = map.keySet<>();
System.out.println(set);

返回[ 及时雨 , 齐天大圣 ]这样的不重复集合结果

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

但如果给相同的key设置了不同的value时:

Map.put("及时雨", "宋江");
Map.put("及时雨", "宋江2");

此时在Map中只会保存第二个,即“宋江2”,即:当我们在Map中存储元素时,key如果重复了,就会更新对应的value值,Map具有去重特性

 但如果给相同的value设置了不同的key时:

Map.put("及时雨", "宋江");
Map.put("齐天大圣", "宋江");

这是可以的,因此key一定是不一样的,但是value是可重复的

【返回所有key-value的映射关系】

Set<Map.Entry<String,String>> entries = map.entrySet();

“map.entrySet()”这个方法会将key和value组织到一起,

它的返回值是“Set<Map.Entry<K,V>>”,K和V填写key和value的数据类型

现在Set中放入的是"Map.Entry<String,String>"这个数据类型,因此里面存入的就是两个该数据类型的元素

输出方式1:

System.out.println(entries);

通过该代码可以返回:[ 及时雨 = 宋江 , 齐天大圣 = 孙悟空 ]这样的不重复集合结果

输出方式2:

通过该代码可以返回以下结果:

因此,Map中的key可以全部分离出来,存储到Collection中任何一个子集合中(value可能有重复)

【关于Map的总结】

1.Map是一个接口,因此它不能去直接实例化,只能去new两个实现类,一个TreeMap,一个HashMap

2.当我们在Map中存储元素时,key如果重复了,就会更新对应的value值,Map具有去重特性,key一定是不一样的,但是value是可重复的

3.在TreeMap中插入键值对时,key不能为null,否则会抛出空指针异常,value可以为null

此外:HashMap中的key和value都可以为null

4.Map中的key可以全部分离出来,存储到Set中进行访问(因为key不能重复);Map中的key可以全部分离出来,存储到Collection中任何一个子集合中(value可能有重复)

5.Map中键值对的key不能直接修改,value可以修改,若要修改key,只能先将key删除掉,然后才能进行重新插入

6.往TreeMap中存储元素时,key一定要是可以比较的,否则就会报“类型转换”异常

TreeMap是一个二叉搜索树,因此源码内部内置了比较方法

Student在这里是一个自定义类型,且没有告诉代码如何比较,所以会抛出类型转换异常 

7.TreeMap和HashMap的区别

【关于Set】

Set和Map的不同点是:Set是继承自Collection的接口类,且Set中只存储了Key

【关于Set的常用方法】

【实例化Set】

【添加元素】

该代码执行后输出的是一个“abc”,而不是两个“abc”

这意味着,Set中不能存储重复的元素

【返回迭代器】

这里的<E>要替换为所打印元素的类型

通过迭代器,可以去遍历Set中所有的元素

【关于Set的总结】

1.Set是继承自Collection的一个接口类

2.Set中只存储了key,并且要求key一定要唯一

3.TreeSet的底层使用Map来实现,其使用Map与Object的一个默认对象作为键值插入到Map中

4.Set最大的功能就是对集合中的元素进行去重

5.Set中的key不能修改,若想修改key只能删除原来的key然后重插

6.TreeSet和HashSet的区别

相关文章:

  • Glide基本用法及With方法源码解析
  • Python保留数据删除Excel单元格的函数和公式
  • 通过PHP获取商品详情
  • 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-30
  • 解锁高效开发的秘密武器
  • 无人机之编队控制篇
  • 【无人机设计与控制】Multi-UAV|多无人机多场景路径规划算法MATLAB
  • Spring Cloud全解析:服务调用之OpenFeign集成OkHttp
  • 【C++算法】8.双指针_三数之和
  • 初识Linux · O(1)调度算法
  • 什么是IIC通信协议?
  • 【网络安全】内部应用中的多重漏洞利用
  • 01---java面试八股文——springboot---10题
  • Java中的Junit、类加载时机与机制、反射、注解及枚举
  • XSS | XSS 常用语句以及绕过思路
  • Android开源项目规范总结
  • iOS小技巧之UIImagePickerController实现头像选择
  • JavaScript-Array类型
  • java取消线程实例
  • PAT A1017 优先队列
  • Python_OOP
  • vue:响应原理
  • win10下安装mysql5.7
  • 分类模型——Logistics Regression
  • 浮现式设计
  • 如何在GitHub上创建个人博客
  • 深入浅出Node.js
  • 推荐一个React的管理后台框架
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • ‌‌雅诗兰黛、‌‌兰蔻等美妆大品牌的营销策略是什么?
  • #Datawhale AI夏令营第4期#多模态大模型复盘
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • (1)常见O(n^2)排序算法解析
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (2020)Java后端开发----(面试题和笔试题)
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (十二)Flink Table API
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (十三)Flask之特殊装饰器详解
  • (文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略
  • (一)80c52学习之旅-起始篇
  • (原创)可支持最大高度的NestedScrollView
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转)平衡树
  • (轉貼) UML中文FAQ (OO) (UML)
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • .NET/C#⾯试题汇总系列:⾯向对象
  • .net开发引用程序集提示没有强名称的解决办法
  • .NET设计模式(11):组合模式(Composite Pattern)