赞
踩
目录
Map和Set是一种专门用来进行搜索的容器或数据结构,其搜索的效率和其具体实例化的子类有关。
我们之前学到的常用的搜索方法有:
1.直接遍历,时间复杂度为O(N)。
2.二分查找法,时间复杂度为。
这两种搜索方法比较适合静态类型的搜索,一般不进行插入或删除操作。那么如果我们要频繁地对元素进行插入或删除操作,然后进行查询(即动态查询),就可以用到Map和Set了。
一般把搜索的数据称为关键字(Key),和关键字对应的称为值(Value),将其称之为Key-value的键值对:
1.纯Key模型:
只有关键字,一般用于查询这个key在不在某个集合中。
2.Key-Value模型:
有关键字也有其相对应的值,一般可用于字典,key做英文,value作为作为进行查询。
Set使用的就算纯Key模型,而Map使用的就算Key-Value模型~~
1.Map是一个接口类,没有继承自Collection,不能直接实例化其对象,如果要实例化对象,只能实例化其子类对象HashMap或者TreeMap。
2.Map中存储的是Key-Value键值对,且Key的值是唯一的,不能重复。
3.在TreeMap中,Key不能为空,否则会抛NullPointerException异常,但是Value值可以为空。在HashMap中Key和Value的值都可以为空。
4.Map中的Key是可以分离出来存放到Set中的,因为Key值是唯一的。
5.Map中的Value是可以分离出来存放到Collection的任意一个子集合中的。
6.Map中的Key值不能修改,而Value值可以修改,如果要修改Key值,则要先删除Key,再插入Key。
7.TreeMap和HashMap的区别:
Map底层结构 | TreeMap | HashMap |
底层结构 | 红黑树 | Hash桶 |
插入/删除/查找时间 复杂度 | O(1) | |
是否有序 | 关于Key有序 | 无序 |
线程安全 | 不安全 | 不安全 |
插入/删除/查找区别 | 需要进行元素比较 | 需要通过hash函数计算hash地址 |
比较与覆写 | key必须要可以比较,(基于Comparable或者基于比较器)否则会抛ClassCastException异常 | 需要重写equals方法和hashCode方法 |
应用场景 | 需要Key在有序的场景下 | 不关心Key是否有序,需要更高的性能 |
Map.Entry <K, V>是Map内部实现的用来存放键值对映射关系的内部类,该内部类中主要提供了 的获取,value的设置以及Key的比较方式。
源码:
- interface Entry<K,V> {
-
- K getKey();
-
- V getValue();
-
- V setValue(V value);
-
- boolean equals(Object o);
-
- int hashCode();
-
- public static <K extends Comparable<? super K>, V> Comparator<Map.Entry<K,V>> comparingByKey() {
- return (Comparator<Map.Entry<K, V>> & Serializable)
- (c1, c2) -> c1.getKey().compareTo(c2.getKey());
- }
可以看出源码并没有提供setKey()的方法。
方法 | 功能 |
V get(Object key) | 返回 key 对应的 value |
V getOrDefault(Object key, V defaultValue) | 返回 key 对应的 value,key 不存在,返回默认值 |
V put(K key, V value) | 设置 key 对应的 value |
V remove(Object key) | 删除 key 对应的映射关系 |
Set<K> keySet() | 返回所有 key 的不重复集合 |
Collection<V> values() | 返回所有 value 的可重复集合 |
Set<Map.Entry<K, V>> entrySet() | 返回所有的 key-value 映射关系 |
boolean containsKey(Object key) | 判断是否包含 key |
boolean containsValue(Object value) | 判断是否包含 value |
Set与Map主要的不同有两点:Set是继承自Collection的接口类,Set中只存储了Key。
方法 | 功能 |
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必须是唯一的,不能重复的。
3.TreeSet的底层使用Map实现的,其使用Key和Object的一个默认对象作为键值对插入到Map中。
4.Set最大的作用就是去重。
5.Set中的Key不能修改,如果要修改,先将原来的删除掉,然后再重新插入。
6.TreeSet中不能插入null做Key,而HashMap可以。
7.实现Set接口的常用类有TreeSet和HashSet,还有一个LinkedHashSet,LinkedHashSet是在HashSet的基础 上维护了一个双向链表来记录元素的插入次序。
8.TreeSet与HashSet的区别:
Set底层结构 | TreeSet | HashSet |
底层结构 | 红黑树 | Hash桶 |
插入/删除/查找时间 复杂度 | O(1) | |
是否有序 | 关于Key有序 | 无序 |
线程安全 | 不安全 | 不安全 |
插入/删除/查找区别 | 按照红黑树的特性进行 | 需要先计算Hash地址 |
比较与覆写 | key必须要可以比较,(基于Comparable或者基于比较器)否则会抛ClassCastException异常 | 需要覆写equals方法和hashCode方法 |
应用场景 | 需要Key有序的情况下 | 需要更高的时间性能 |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。