一、概念
Map
和
set
是一种专门用来进行搜索的容器或者数据结构,其搜索的效率与其具体的实例化子类有关。
Map
和
Set
是一种适合动态查找的集合容器。
模型
一般把搜索的数据称为关键字(
Key
),和关键字对应的称为值(
Value
),将其称之为
Key-value
的键值对,所以模型会有两种:
1.
纯
key
模型
,比如:
有一个英文词典,快速查找一个单词是否在词典中 快速查找某个名字在不在通讯录中
2.
Key-Value
模型
,比如:
***统计文件中每个单词出现的次数,统计结果是每个单词都有与其对应的次数:
<
单词,单词出现的次数
> (String,Integer)。
***梁山好汉的江湖绰号:每个好汉都有自己的江湖绰号(String,String)
而
Map
中存储的就是
key-value
的键值对,
Set
中只存储了
Key
。
二、Map
2.1Map简介
Map
是一个接口类,该类没有继承自
Collection
,该类中存储的是
<K,V>
结构的键值对,并且
K
一定是唯一的,不
能重复
。
2.2Map.Entry<K,Y>
Map.Entry<K, V>
是
Map
内部实现的用来存放
<key, value>
键值对映射关系的内部类
,该内部类中主要提供了<key, value>的获取,
value
的设置以及
Key
的比较方式。
方法:getKey()——返回entry的Key
getValue()——返回entry的Value
setValue()——
将键值对中的
value
替换为指定
value
注意:
Map.Entry<K,V>
并没有提供设置
Key
的方法
2.3 Map 的常用方法
注意:
1. Map
是一个接口,不能直接实例化对象
,如果
要实例化对象只能实例化其实现类
TreeMap
或者HashMap
2. Map
中存放键值对的
Key
是唯一的,
value是可以重复的
3. 在
TreeMap
中插入键值对时,
key
不能为空,否则就会抛
NullPointerException
异常
,
value可以为空。但是HashMap的
key
和
value都可以为空。
4. Map
中的
Key
可以全部分离出来,存储到
Set
中
来进行访问
(
因为
Key
不能重复
)。
5. Map
中的
value
可以全部分离出来,存储在
Collection
的任何一个子集合中
(value
可能有重复
)。
6. Map中键值对的
Key
不能直接修改,
value
可以修改,如果要修改
key
,只能先将该
key删除掉,然后再来进行重新插入。
7. TreeMap
和
HashMap
的区别
三、Set
3.1set的常用方法
boolean add
(E e) ——添加元素,但重复元素不会被添加成功
void clear
() ——清空集合
boolean contains
(Object o) ——判断 o
是否在集合中
Iterator<E> iterator
() ——返回迭代器
boolean remove
(Object o) ——删除集合中的 o
int size() ——返回set
中元素的个数
boolean isEmpty() ——检测set
是否为空,空返回
true
,否则返回
false
Object[] toArray() ——将set
中的元素转换为数组返回
boolean containsAll(Collection<?> c) ——集合c
中的元素是否在
set
中全部存在,是返回
true
,否则返回false
boolean addAll(Collection<? extends E> c) ——将集合c中的元素添加到
set
中,可以达到去重的效果
注意点:
1. Set
是继承自
Collection
的一个接口类
2. Set
中只存储了
key
,并且要求
key
一定要唯一
3. TreeSet
的底层是使用
Map
来实现的,其使用
key
与
Object
的一个默认对象作为键值对插入到
Map
中的
4. Set
最大的功能就是对集合中的元素进行去重
5.
实现
Set
接口的常用类有
TreeSet
和
HashSet
,还有一个
LinkedHashSet
,
LinkedHashSet
是在
HashSet
的基础上维护了一个双向链表来记录元素的插入次序。
6. Set
中的
Key
不能修改,如果要修改,先将原来的删除掉,然后再重新插入
7. TreeSet
中不能插入
null
的
key
,
HashSet
可以。