java-->TreeMap的使用
0- 继承结构
1- 简介
- TreeMap的底层实现原理
基于红黑树实现的排序Map
- TreeMap增删改查的时间复杂度
TreeMap的增删改查和统计相关的操作的时间复杂度都为 O(logn)
- TreeMap的key和value的要求
- 由于实现了Map接口,则key的值不允许重复(重复则覆盖),也不允许为null,按照key的自然顺序排序或者Comparator接口指定的排序方法进行排序。
- value允许重复,也允许为null,当key重复时,会覆盖此value值。
2- TreeMap的使用场景
考虑如下场景:
- 需要基于排序的统计功能:
由于TreeMap是基于红黑树的实现的排序Map,对于增删改查以及统计的时间复杂度都控制在O(logn)的级别上,相对于HashMap和LikedHashMap的统计操作的(最大的key,最小的key,大于某一个key的所有Entry等等)时间复杂度O(n)具有较高时间效率。
- 需要快速增删改查的存储功能:
相对于HashMap和LikedHashMap 这些 hash表的时间复杂度O(1)(不考虑冲突情况),TreeMap的增删改查的时间复杂度为O(logn)就显得效率较低。
- 需要快速增删改查而且需要保证遍历和插入顺序一致的存储功能:
相对于HashMap和LikedHashMap 这些 hash表的时间复杂度O(1)(不考虑冲突情况),TreeMap的增删改查的时间复杂度为O(logn)就显得效率较低。但是HashMap并不保证任何顺序性。LikedHashMap额外保证了Map的遍历顺序与put顺序一致的有序性。
综上:场景1适合使用TreeMap,场景2适合使用HashMap,场景3适合使用LikedHashMap,需要注意它们都是非线程安全的,当在并发场景下可以使用其他并发集合或者调用者在调用层去控制并发使得操作串行执行。
-
构造方法摘要
构造方法 Constructor and Description TreeMap()
使用其键的自然排序构造一个新的空树状图。TreeMap(Comparator<? super K> comparator)
构造一个新的,空的树图,按照给定的比较器排序。TreeMap(Map<? extends K,? extends V> m)
构造一个新的树状图,其中包含与给定地图相同的映射,根据其键的 自然顺序进行排序 。TreeMap(SortedMap<K,? extends V> m)
构造一个包含相同映射并使用与指定排序映射相同顺序的新树映射。
-
方法摘要
所有方法接口方法具体的方法 Modifier and Type Method and Description Map.Entry<K,V>
ceilingEntry(K key)
返回与大于或等于给定键的最小键相关联的键值映射,如果没有此键,则null
。K
ceilingKey(K key)
返回大于或等于给定键的null
键,如果没有此键,则返回null
。void
clear()
从这张地图中删除所有的映射。Object
clone()
返回此TreeMap
实例的浅拷贝。Comparator<? super K>
comparator()
返回用于订购此地图中的键的比较器,或null
如果此地图使用其键的natural ordering 。boolean
containsKey(Object key)
如果此映射包含指定键的映射,则返回true
。boolean
containsValue(Object value)
如果此地图将一个或多个键映射到指定值,则返回true
。NavigableSet<K>
descendingKeySet()
返回此地图中包含的键的相反顺序NavigableSet
。NavigableMap<K,V>
descendingMap()
返回此映射中包含的映射的反向排序视图。Set<Map.Entry<K,V>>
entrySet()
返回此地图中包含的映射的Set
视图。Map.Entry<K,V>
firstEntry()
返回与该地图中的最小键相关联的键值映射,如果地图为空,则返回null
。K
firstKey()
返回此地图中当前的第一个(最低)键。Map.Entry<K,V>
floorEntry(K key)
返回与小于或等于给定键的最大键相关联的键值映射,如果没有此键,则null
。K
floorKey(K key)
返回小于或等于给定键的最大键,如果没有这样的键,则返回null
。void
forEach(BiConsumer<? super K,? super V> action)
对此映射中的每个条目执行给定的操作,直到所有条目都被处理或操作引发异常。V
get(Object key)
返回到指定键所映射的值,或null
如果此映射包含该键的映射。SortedMap<K,V>
headMap(K toKey)
返回此地图部分的视图,其密钥严格小于toKey
。NavigableMap<K,V>
headMap(K toKey, boolean inclusive)
返回此地图部分的视图,其键值小于(或等于,如果inclusive
为真)toKey
。Map.Entry<K,V>
higherEntry(K key)
返回与最小密钥相关联的密钥值映射严格大于给定密钥,如果没有这样的密钥则null
。K
higherKey(K key)
返回严格大于给定键的最小键,如果没有这样的键,则返回null
。Set<K>
keySet()
返回此地图中包含的键的Set
视图。Map.Entry<K,V>
lastEntry()
返回与该地图中最大关键字关联的键值映射,如果地图为空,则返回null
。K
lastKey()
返回当前在此地图中的最后(最高)键。Map.Entry<K,V>
lowerEntry(K key)
返回与最大密钥相关联的密钥值映射严格小于给定密钥,如果没有这样的密钥,则null
。K
lowerKey(K key)
返回严格小于给定键的最大键,如果没有这样的键,则返回null
。NavigableSet<K>
navigableKeySet()
返回此地图中包含的键的NavigableSet
视图。Map.Entry<K,V>
pollFirstEntry()
删除并返回与该地图中的最小键相关联的键值映射,如果地图为空,则返回null
。Map.Entry<K,V>
pollLastEntry()
删除并返回与该地图中最大密钥相关联的键值映射,如果地图为空,则返回null
。V
put(K key, V value)
将指定的值与此映射中的指定键相关联。void
putAll(Map<? extends K,? extends V> map)
将指定地图的所有映射复制到此地图。V
remove(Object key)
从此TreeMap中删除此键的映射(如果存在)。V
replace(K key, V value)
只有当目标映射到某个值时,才能替换指定键的条目。boolean
replace(K key, V oldValue, V newValue)
仅当当前映射到指定的值时,才能替换指定键的条目。void
replaceAll(BiFunction<? super K,? super V,? extends V> function)
将每个条目的值替换为对该条目调用给定函数的结果,直到所有条目都被处理或该函数抛出异常。int
size()
返回此地图中键值映射的数量。NavigableMap<K,V>
subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive)
返回此地图部分的视图,其关键范围为fromKey
至toKey
。(boolean true代表包含,false代表不包含)SortedMap<K,V>
subMap(K fromKey, K toKey)
返回此地图部分的视图,其关键字范围从fromKey
(含)到toKey
,独占。SortedMap<K,V>
tailMap(K fromKey)
返回此地图部分的视图,其键大于等于fromKey
。NavigableMap<K,V>
tailMap(K fromKey, boolean inclusive)
返回此地图部分的视图,其键大于(或等于,如果inclusive
为真)fromKey
。Collection<V>
values()
返回此地图中包含的值的Collection
视图。