Map和Set接口
两者的存在意义❓
Map和Set是一种专门用来进行搜索的容器,或者说数据结构,其搜索的效率与具体的实例化子类有关,在学习这两个搜索容器之前,我们所熟知的所搜方式比如有:
-
直接遍历查找
时间复杂度为O(n),元素越多,遍历就会越慢
-
二分查找
时间复杂度为O(logn),并且二分查找之前,数组还必须已经是有序了,那这个限制就比较大了
其次上述两种排序,比较适合静态的查找,即在查找过程中最好不要对一份数据进行插入或者删除,但现实是有很多数据时查找的过程中,对数据都会有多多少少的进行动态的读写操作,就比如L根据姓名查找考试成绩,那此时Map和Set就是比较适合用于动态查找的情况.
模型🚶
一般把搜索的数据称为关键字key,和关键字对应的值(value),两者一结合:key-value就是所谓的键值对,所以模型一般有两种:
-
纯key模型
比如查字典
-
key-value模型
比如根据梁山好汉的名字去查他们的绰号等
Map中存储的就是键值对,而Set集合中只存储Key
关于Map的说明🦅
Map是一个接口类,该类没有继承Collection,该类中存储的是<K,V>结构的键值对,并且k一定是唯一的,不能重复,并且插入同一个键的时候,老值将会被新值所覆盖
关于Map.Entry<K,V>的说明:🏎
Map.Entry<K,V>是Map内部实现的用于存放<Key,Value>键值对映射关系的内部类,该类提供了一些方法:
方法 | 解释 |
---|---|
K getKey() | 获取entry的关键字key |
V getValue() | 获取entry的值value |
V setValue(V value) | 将键值对的value设置为指定的value |
注意:对每一个键值对,Map.Entry<K,V>并没有设置修改key的方法
Map的常用方法🍊
方法 | 解释 |
---|---|
V get(Object key) | 根据Key获取对应的value |
V getOrDefault(Object key,V defaultValue) | 根据Key获取value,如果map里没有这个key,那就返回这个默认的值 |
put(k,v) | 存放键值对 |
V remove(K key) | 根据key找到对应的键值对,并将其删除,返回值是那个被删除的键值对的值 |
Set keySet() | 将map中所有的键进行保存,保存至set集合中 |
Set<Map.Entry<K,V>> entrySet() | 以键值对的形式,将map中所有的键值对进行存储,存储至Set集合中 |
Collection values() | 将map中所有的值进行存储,存储至Collection集合当中 |
boolean containsKey(Object key) | 查看map中是否包含key这个键 |
boolean containsValue(Object value) | 查看map中是否包含value这个值 |
Map的使用注意事项😋
- Map是一个接口,不能直接实例化对象,如果实例化对象只能实例化其实现类TreeMap或者说HashMap
- Map中存放的键都是唯一的,而每个键所对应的值在map中可以是多份
- 因为Map有两个具体的实现类TreeMap和HashMap,前者底层是红黑树,存放的键必须要能够比较,所以实例化的是前者的话,key不能存放null,而hashmap可以,值value两者都可以存放null
- Map中的所有键值对的键都可以分离出来:ketSet(),并存放至Set集合中
- Map中所有键值对的值都可以分离出来:values(),并存放至Collection集合中
- Map中的键值对的键都不能修改,要是想修改,只能删除那个键值对,再插入新的键值对
关于Set的说明📦
存在意义:降重⚙️
Set的常用方法👶
方法 | 解释 |
---|---|
boolean add(E e) | 加键 |
void clear() | 清空set集合 |
Iterator iterator() | 因为Set实现了Iterable接口,所以可以使用迭代器 |
boolean contains(Object o) | 查看set集合中是否包含o |
int size() | 查看set中有几个键 |
boolean isEmpty() | 查看set集合是否为空 |
boolean containsAll(Collection<?> c) | 查看set中是否包含集合c中的所有成员 |
boolean addAll(Collection<?> c) | 将集合c中所有的元素都添加至set中 |
boolean remove(Object o) | 删除set中的o |
Set的使用注意事项🌵
- Set继承自Collection
- Set只存键,且要求键唯一
- Set底层是有map实现的,其使用key和一个Object的默认对象作为值,组成键值对存至map中
- Set的最大功能就是进行降重
- 实现Set接口的具体实现类有:TreeSet和HashSet,其实还有一个LinkedHashSet,LinkedHashSet是在HashSet的基础之上,维护了一个双向链表来记录元素的插入次序
- Set中的key不可被修改,要想修改也是要先删除,再重新插入一个
- Set中不能插入null的key(这对TreeSet而言,因为TreeSet有序,要求元素必须能够比较,null不可比较,所以HashSet是可以存放null的)
参照例题:💅
力扣138(赋值带随机指针的链表)
力扣771(宝石与石头)
牛客(坏键盘打字)
力扣692(前k个高频单词)
(均参考力扣专栏)