TreeMap
- 线程不安全,基于红黑树实现的有序集合。
- 集合顺序默认为自然排序,也可以自定义比较器实现排序规则。
- 实现NavigableMap接口,实现一些了系列导航定位方法。
- 集合操作开销在 O(LogN)【containkey\get\put\remove】。
-
Get方法过程
使用key在红黑树中进行遍历查找,如果Key小于树节点中的key值,则进入左子树继续查找。Key大于树节点中的key值则进入右子树查找,直到找到为止。 -
Put方法过程
如果Root节点为空,则插入的kv对,保存在Root节点中。
如果Root不为空,则遍历红黑树,检测树中是否存在该Key:
如果存在,则更新Key对应的Value。
如果不存在,则根据插入KEY值与树节点比较大小的结果,插入树节点的左边【小于】或右边【大于】。
最后调整树的使红黑树平衡。 -
TreeMap的排序顺序
默认情况下使用Key的自然序【Key类实现Comparable接口】进行排序构建红黑树。
也可实现Comparator接口,实现自定义比较器,自定义排序规则。 -
关于GetFirstEntry、GetLastEntry方法
First取得是红黑树中最左边的孩子节点。
Last取得是红黑树中最右边的孩子节点。 -
关于ceilingEntry方法
取得大于等于Key节点中的最小值。 -
关于containsValue方法的遍历顺序
该方法判断传入的VALUE在红黑树中是否存在,使用中序“左根右”的方式【从小到大】遍历树。【其中root节点的父节点为NULL】 -
支持的子集合类型
NavigableSubMap【升序、降序导航子集合视图】
EntrySet:树中的所有节点【一个节点包含K\V】可视为一个集合。
KeySet:树中所有节点的Key可视为一个集合。且该集合实现了NavigableSet接口。
Values: 树种所有节点的Values作为Collection,允许重复的值。 -
关于NavigableMap
扩展自Sortedmap接口,定义一系列导航定位的方法【匹配最接近值的方法】。
比如:LowerXXX、HigherXXX、FloorXXX、CeilingXXX
以及定义了返回多种子集合的方法。
比如:SubMap、HeadMap、TailMap。 -
和LinkedHashMap比较
LHM更适合做LRU缓存,其顺序是按插入或访问时顺序确定。
TM按自然序、或自定义规则进行排序,插入元素时按排序规则插入树种,可使用迭代器按顺序取出,适合做升序、降序排名。
TM比LHM【HM】占用内存空间更小,因为基于HashMap的数组中存在大量未使用的空槽位。
LHM集合操作比TM要快,但TM没有LHM扩容时重HASH的开销。
TreeSet
线程不安全,基于TreeMap【底层使用红黑树】实现的、存储非重复元素的、有序集合。
- TreeSet底层实现通过关联TreeMap对象实现。
- 大部分方法实现都使用TreeMap提供的方法,相当于一个包装器。
- 元素顺序支持按自然序或比较器进行排序。
- 继承自NavigableSet接口,提供导航方法支持。【NavigableSet接口扩展自SortedSet接口】