Java知识点总结:想看的可以从这里进入
目录
- 8.3、map结构
- 8.3.1、 map接口
- 8.3.2、HashMap
- 8.3.3、LinkedHashMap
- 8.3.4、TreeMap
8.3、map结构
8.3.1、 map接口
map的集合是以键值对的形式存在的 (key-value),每个键只能对应一个值,通常通过键去查找值,所以键是唯一的不可重复,而值则没有限制(键和值可以是任何引用类型的数据,但是键最常用的是String类型)
方法:
1、int size():返回map中key-value对的个数
2、boolean isEmpty():判断当前map是否为空
3、boolean containsKey(Object key):判断一个键是否存在
boolean containsValue(Object value):判断一个值是否存在
4、V get(Object key):根据key获取值
5、V put(key,value):添加一个键值对元素(如果该键已存在,则更改其value值)
void putAll(map2):将map2中的所有键值添加
6、V remove(Object key):根据键移除一个键值对元素
7、void clear():清空
8、Set<K> keySet():将所有的键放到set集合中
9、Collection<V> values():将值放到Collection集合中
10、Set<Map.Entry<K, V>> entrySet():返回map中键值的映射集合到set中,key=value形式
11、int hashCode():返回哈希吗
12、boolean equals(Object o):当哈希码相同的时候,使用equals判断
8.3.2、HashMap
HashMap链接
8.3.3、LinkedHashMap
LinkedHashMap 是 HashMap 的子类,它在HashMap的基础上增加了双向链表的结构
,可以通过双向链表记录数据的插入顺序
,与LinkedHashSet类似,LinkedHashMap 可以维护 Map 的迭代顺序:迭代顺序与 Key-Value 对的插入顺序一致。他对HashMap中的一些方法进行了重写,让所有对底层HashMap数据结构修改的同时也对该链表进行修改,遍历的时候便是遍历这一条有序的链表。(主要是在HashMap方法的基础上,添加了一些双向链表的操作,其他的特性基本没有更改)
在LinkedHashMap 中有一个属性 accessOrder,它控制LinkedHashMap的排序方式,如果它为false时,是按照插入顺序来排序的,但是设置了accessOrder = true 时,则在调用get()方法时,会因为 if(accessOrder == true ) 而调用afterNodeAccess方法来调整顺序。基于get()在accessOrder为true时,会将访问到的元素放到链表的最后的特性,可以使用LinkedHashMap实现LRU缓存。
8.3.4、TreeMap
基于红黑树(Red-Black tree)的 NavigableMap
实现,该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。它可以保证所有的 Key-Value 对处于有序状态。
TreeMap判断两个key相等的标准:两个key通过compareTo()方法或者compare()方法返回0。
同样它排序也是依据Comparable 和 Comparator 实现的:
- 自然排序:TreeMap 的所有的 Key 必须实现 Comparable 接口,而且所有的 Key 应该是同一个类的对象,否则将会抛出 ClasssCastException
- 定制排序:创建 TreeMap 时,传入一个 Comparator 对象,该对象负责对TreeMap 中的所有 key 进行排序。此时不需要 Map 的 Key 实现Comparable 接口
使用其键的自然顺序构造一个新的空树图。插入所有键都必须实现Comparable接口
public TreeMap() {
comparator = null;
}
造一个新的空树图,根据给定的比较器排序。插入映射中的所有键必须由给定的比较器相互比较
public TreeMap(Comparator<? super K> comparator) {
this.comparator = comparator;
}
构造一个新的树映射,包含与给定映射相同的映射,根据其键的自然顺序排序。插入到新映射中的所有键都必须实现Comparable接口。
public TreeMap(Map<? extends K, ? extends V> m) {
comparator = null;
putAll(m);
}
构造一个包含相同映射并使用与指定排序映射相同顺序的新树映射。该方法以线性时间运行。
public TreeMap(SortedMap<K, ? extends V> m) {
comparator = m.comparator();
try {
buildFromSorted(m.size(), m.entrySet().iterator(), null, null);
} catch (java.io.IOException | ClassNotFoundException cannotHappen) {
}
}
1、int size():返回此映射中键值映射的数量。
2、boolean containsKey(Object key):判断key是否存在
boolean containsValue(Object value):判断值是否存在
3、V get(Object key):根据key获取值
K firstKey():获取第一个key
K lastKey():获取最后一个key
Map.Entry<K, V> firstEntry():返回该TreeMap的第一个(最小的)映射
Map.Entry<K, V> lastEntry():返回该TreeMap的最后一个(最大的)映射
SortedMap<K, V> headMap(K toKey):返回该TreeMap中严格小于指定key的映射集合
SortedMap<K, V> subMap(K fromKey, K toKey):返回该TreeMap中指定范围的映射集合(大于等于fromKey,小于toKey)
4、putAll(Map<? extends K, ? extends V> map):将指定映射中的所有映射复制到此映射。
V put(K key, V value) :添加元素
5、void clear():清空TreeMap中的所有元素
6、V remove(Object key):从TreeMap中移除指定key对应的映射
7、V replace(K key, V value):替换指定key对应的value值
boolean replace(K key, V oldValue, V newValue):当指定key的对应的value为指定值时,替换该值为新值
8、Collection<V> values():返回由该TreeMap中所有的values构成的集合
Set<Map<K, V>> entrySet():返回由该TreeMap中的所有映射组成的Set对象