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

相关推荐
搬砖的小码农_Sky2 小时前
C语言:数组
c语言·数据结构
先鱼鲨生4 小时前
数据结构——栈、队列
数据结构
一念之坤4 小时前
零基础学Python之数据结构 -- 01篇
数据结构·python
IT 青年4 小时前
数据结构 (1)基本概念和术语
数据结构·算法
熬夜学编程的小王4 小时前
【初阶数据结构篇】双向链表的实现(赋源码)
数据结构·c++·链表·双向链表
liujjjiyun5 小时前
小R的随机播放顺序
数据结构·c++·算法
Reese_Cool6 小时前
【数据结构与算法】排序
java·c语言·开发语言·数据结构·c++·算法·排序算法
djk88887 小时前
.net将List<实体1>的数据转到List<实体2>
数据结构·list·.net
搬砖的小码农_Sky7 小时前
C语言:结构体
c语言·数据结构
_OLi_9 小时前
力扣 LeetCode 106. 从中序与后序遍历序列构造二叉树(Day9:二叉树)
数据结构·算法·leetcode