|
|
简介
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})$。
包含
|
|
遍历
|
|
前驱和后继
|
|