|
|
简介
TreeMap是一种基于红黑树实现的key-value结构,非线程安全的。
如果没有使用自定义的Comparator对Key为null进行相应的处理,则不支持Key为null。
关于红黑树的介绍可以参见:数据结构与算法(9): 树形结构- 红黑树
在使用集合视图在HashMap中迭代时,是不能保证迭代顺序的;LinkedHashMap使用了双向链表,保证按照插入顺序或访问顺序进行迭代。TreeMap支持按键进行排序,可以由传入的比较器(Comparator)来控制(当然,自己也可以实现Comparator利用value进行排序)。
SortedMap对排序进行了相关说明:A Map that further provides a total ordering on its keys.
SortedMap
SortedMap接口扩展自Map接口,对该接口的实现要保证所有的Key是完全有序的,这个顺序一般指key的自然序(实现Comparable接口)或在创建SortedMap时指定一个比较器(Comparator),当使用集合的视图(Collection View,由entrySet、keySet和values方法提供)来迭代时就可以按序访问其中的元素。
插入
SortedMap中的所有Key的类都必须实现Comparable接口(或者可以作为指定的Comparator的参数)。
SortedMap中的Key的顺序必须和equals保持一致,即k1.compareTo(k2) == 0(or comparator.compare(k1, k2) == 0)和k1.equals(k2)要有相同的布尔值。
这是因为 Map 接口的定义中,比较 Key 是通过 equals 方法,而在 SortedMap 中比较 Key 则是通过 compareTo (or compare) 方法。如果不一致的,就破坏了 Map 接口的约定。
NavigableMap
NavigableMap时JDK 1.6之后新增的接口,扩展了SortedMap接口,提供了一些导航方法来返回最接近搜索目标的匹配结果。
lowerEntry(K key)(orlowerKey(K key)),小于给定 Key 的 Entry (or Key)floorEntry(K key)(orfloorKey(K key)),小于等于给定 Key 的 Entry (or Key)higherEntry(K key)(orhigherKey(K key)),大于给定 Key 的 Entry (or Key)ceilingEntry(K key)(orceilingKey(K key)),大于等于给定 Key 的 Entry (or Key)
NavigableMap 可以按照 Key 的升序或降序进行访问和遍历。 descendingMap() 和 descendingKeySet() 则会获取和原来的顺序相反的集合,集合中的元素则是同样的引用,在该视图上的修改会影响到原始的数据。
源码分析
属性
|
|
构造方法
红黑树节点
|
|
方法
put添加及更新
为了维持红黑树的有序,添加及更新的代价较高,复杂度为$O(\log{N})$。
删除
红黑树的删除较为复杂
查找
红黑树的查找复杂度为$O(\log{N})$。
包含
|
|
遍历
|
|
前驱和后继
|
|