【数据结构】Map&Set

【概念】

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】

java 复制代码
Map<String,String> map = new TreeMap<>();

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

【设置key对应的value】

java 复制代码
Map.put("及时雨", "宋江");
Map.put("齐天大圣", "孙悟空");

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

【获取key对应的value】

java 复制代码
String val = map.get("齐天大圣");
System.out.println(val);

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

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

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

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

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

【删除key对应的value】

java 复制代码
String val3 = map.remove("齐天大圣");
System.out.println(val3);

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

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

java 复制代码
Set<String> set = map.keySet<>();
System.out.println(set);

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

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

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

java 复制代码
Map.put("及时雨", "宋江");
Map.put("及时雨", "宋江2");

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

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

java 复制代码
Map.put("及时雨", "宋江");
Map.put("齐天大圣", "宋江");

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

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

java 复制代码
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:

java 复制代码
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的区别

相关推荐
Trouvaille ~2 小时前
【C++篇】在秩序与混沌的交响乐中: STL之map容器的哲学探寻
开发语言·数据结构·c++·算法·迭代器模式·stl·map
五条凪4 小时前
从零开始的LeetCode刷题日记:70. 爬楼梯
数据结构·算法·leetcode·职场和发展·1024程序员节
小丁爱养花5 小时前
算法专题:栈
数据结构·算法·leetcode
Charary5 小时前
链表练习记录
c语言·数据结构·学习·链表
算法与编程之美6 小时前
list与iterator的之间的区别,如何用斐波那契数列探索yield
数据结构·list
TANGLONG2228 小时前
【初阶数据结构与算法】复杂度分析练习之轮转数组(多种方法)
java·c语言·数据结构·c++·python·算法·面试
sjsjs118 小时前
【数据结构-合法括号字符串】力扣1963. 使字符串平衡的最小交换次数
数据结构·算法·leetcode
921正在学习编程10 小时前
数据结构之二叉树--前序,中序,后序详解(含源码)
c语言·数据结构·算法·二叉树
王老师青少年编程11 小时前
CSP/信奥赛C++完整学习规划(价值2万的csp-j完整课程体系)
数据结构·c++·算法·语法·csp·信奥赛
酷酷的崽79811 小时前
【递归】——五道经典链表与递归问题的深度解析
数据结构·链表