模型
一般我们把搜索的数据称为 关键字(key) , 关键字对应的值叫做 值(value) , 将之称为 key-value 键值对. 衍生出两种模型:
1. 纯 key 模型
例如 : 班级上点名, 在花名册上找人的名字.
2. key-value 模型
例如 : 统计一个字符串中每个字母出现的次数, 结果是每个字母和它对应所出现的次数
Map 就使用 key-value模型, Set 使用 纯key模型
Map 的使用
1.对于 Map 的说明
Map是一个接口类,该类没有继承自Collection,该类中 存储 的是 <key, value>结构的键值对,并且Key一定是唯一 的,不能重复.
2. Map 的常用方法
方法 | 解释 |
put (K key,V value) | 将 key - value 映射关系放入到 map 集合中(若存在,则替换) |
get (Object k) | 返回 k 对应 value(若该键不存在,则返回 Null) |
getOrDefault (K key,V defaultValue) | 返回 k 对应的 value(若该键不存在,则返回 defaultValue,但不会修改集合本身) |
remove (K key) | 删除 key - value 映射关系(若存在则返回 value,否则返回 null,会修改集合) |
Set< K > keySet() | 返回所有 key 的不重复集合 |
Collection< V > values() | 返回所有 value 的可重复集合 |
| 返回所有的 key-value 映射关系 |
boolean containsKey(Object key) | 判断是否包含 key |
boolean containsValue(Object value) | 判断是否包含 value |
注意:
-
Map是一个接口,不能直接实例化对象,如果要实例化对象只能实例化其实现类TreeMap或者HashMap
-
Map中存放键值对的Key是唯一的,value是可以重复的
-
在Map中插入键值对时,key不能为空,否则就会抛NullPointerException异常,但是value可以为空
-
Map中的Key可以全部分离出来,存储到Set中来进行访问(因为Key不能重复)
-
Map中的value可以全部分离出来,存储在Collection的任何一个子集合中(value可能有重复)
-
Map中键值对的Key不能直接修改,value可以修改,如果要修改key,只能先将该key删除掉,然后再来进重新插入
3. Map的底层结构
Map 底层结构 | TreeMap | HashMap |
底层结构 | 红黑树 | 哈希桶 |
插入 / 删除 / 查找时间复杂度 | O(log2 N) | O(1) |
是否有序 | 关于 Key 有序 | 无序 |
线程安全 | 不安全 | 不安全 |
插入 / 删除 / 查找区别 | 需要进行元素比较 | 通过哈希函数计算哈希地址 |
比较 与 覆写 | key 必须能够比较,否则会抛出异常 | 自定义类型需要覆写 equals 和 hashCode 方法 |
应用场景 | 需要 Key 有序场景下 | Key 是否有序不关心,需要更高的时间性能 |
Set 的使用
1. 作用
去重,Set与Map主要的不同有两点:Set是继承自Collection的接口类,Set中只存储了Key.
遍历Set集合,直接使用for - each循环即可(只要是Iterable接口的子类,都可以直接使用for - each循环),在遍历Map集合时需要将Map转为Set - for(Map.entry<具体类型> entry : map.entrySet())
2. Set 的说明
Set与Map主要的不同有两点:Set是继承自Collection的接口类,Set中只存储了Key。
3. Set 常用方法
返回类型 | 方法名 | 说明 |
boolean | add(E e) | 若指定元素不存在,则将该元素添加 |
void | clear() | 清空集合 |
boolean | isEmpty() | 判断集合是否为空 |
int | size() | 返回元素个数 |
boolean | remove(Object o) | 删除指定元素 |
boolean | contains(Object o) | 返回是否存在该元素 |
boolean | retainAll(Collection<?> c) | 求 this 和 c 的交集 |
Iterator< E > | iterator() | 返回迭代器 |
Object[] | toArray() | 将 set 中的元素转换为数组返回 |
注意:
1、Set是继承自Collection的一个接口类
2、Set中 只存储了key,并且要求 key一定要唯一
3、Set的 底层 是使用 Map 来实现的,其使用key与Object的一个默认对象作为键值对插入到Map中
4、Set最大的功能就是对 集合中的元素进行去重
5、实现Set接口的常用类有TreeSet和HashSet,还有一个LinkedHashSet,LinkedHashSet是在HashSet的基础上维护了一个双向链表来记录元素的插入次序。
6、Set中的Key不能修改,如果要修改,先将原来的删除掉,然后再重新插入
7、Set中 不能插入null的key。