之前在看java集合类的时候没注意map中还有一个TreeMap这个类,本文主要是对属于java集合类的TreeMap成员,进行源码分析和理解。
继承结构
public class TreeMap<K,V>
extends AbstractMap<K,V>
implements NavigableMap<K,V>, Cloneable, java.io.Serializable
这些继承的父类或者实现的接口保证了TreeMap所具有的一系列特性,比如有序性,可以克隆,可以序列化等等。
重要属性
|
|
构造方法
下面是两个比较基本的构造方法,还有一些其他不列举了。
put
map的类基本最常用的就是put和get方法,就从put方法开始:
put方法的结尾有一个方法fixAfterInsertion(e)
,从名字中看不出任何意思,知道它是在插入元素之后做一些调整工作,实际是每次插入完元素后会将树调整为红黑树,下面是红黑树具体实现代码:
get
get方法比较简单,用比较器从根节点挨个比较,如果比较结果cmp=0即返回。
小结
A Red-Black tree based NavigableMap implementation. The map is sorted according to the natural ordering of its keys, or by a Comparator provided at map creation time, depending on which constructor is used.
This implementation provides guaranteed log(n) time cost for the containsKey, get, put and remove operations.
TreeMap自身有以下一些特性:
- 从TreeMap开始的注释文档中可以看,TreeMap是基于纯粹的红黑树构建的。
- 相对于HashMap的无序性来说,TreeMap实现了NavigableMap这一接口,而NavigableMap继承了SortedMap接口,因此这保证了它的有序性。
- 另外,红黑树的结构保证了TreeMap对于get、put、remove等操作都是log(n)的时间复杂度,效率较高。
与HashMap比较而言:
- HashMap:适用于在Map中插入、删除和定位元素。
- Treemap:适用于按自然顺序或自定义顺序遍历键(key)。
基于树和哈希表的数据结构使然,HashMap通常比TreeMap快一点,建议多使用HashMap,在需要排序的Map时候才用TreeMap。