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

【数据结构】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的区别


http://www.kler.cn/a/329072.html

相关文章:

  • 第13天:高级主题 - ViewModel 和 LiveData
  • 鸿蒙实战:页面跳转传参
  • 退款成功订阅消息点击后提示订单不存在
  • 汽车与摩托车分类数据集
  • Java通过calcite实时读取kafka中的数据
  • SpringBoot总结
  • spring loCDI 详解
  • 文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《基于节点碳势响应的新型电力系统鲁棒优化调度 》
  • springbot,JWT令牌的使用。实现http请求拦截校验。
  • 如何使用ssm实现影院管理系统的设计与实现
  • vscode中配置python虚拟环境
  • 大数据-151 Apache Druid 集群模式 配置启动【上篇】 超详细!
  • [深度学习]基于YOLO高质量项目源码+模型+GUI界面汇总
  • 如何通过Dockfile更改docker中ubuntu的apt源
  • Linux 搭建与使用yolov5训练和检验自建模型的步骤
  • Jenkins pipeline配置示例
  • NLP任务一些常用的数据集集锦
  • 解决 Adobe 盗版弹窗
  • 【Linux 从基础到进阶】HBase数据库安装与配置
  • 【DAY20240926】06从入门到精通:掌握 Git 分支操作的实用指南
  • 修复OpenSSH远程代码执行漏洞:版本升级到9.9p1
  • springboot启动流程
  • vue基于Spring Boot框架的高校实验室预约管理系统
  • 论文阅读:多模态医学图像融合方法的研究进展
  • golang rpc
  • TCP\IP标准与OSI标准