前言:
在上一篇文章:Java集合框架—LinkedHashMap—源码研读 中,我们深入学习了LinkedHashMap,现在,让我们开始学习更进阶一点的内容——TreeMap。学习TreeMap前,最好需要先了解一下比较器Comparat、二叉排序树、红黑树据结构的知识。
所以此篇文章,分为3个部分:
1.比较器Comparator和Comparable接口
2.红黑树和二叉排序树
3.红黑树的左旋和右旋
4.TreeMap的源码分析-put()方法、fixAfterInsertion()解读
1.比较器Comparator和Comparable接口
首先,HashMap中的键值对是无序的,LinkedHashMap的出现使得键值对可以按照插入顺序被遍历,但是有很多场景下,我需要根据插入其中的键值对中的key来进行排序,而不是简单的根据插入顺序。那么此时LinkedHashMap便无能为力了!这时,TreeMap就派上了用场,因为TreeMap天生就实现了SortedMap接口,而SortedMap是为了排序而存在的。
让我们先看一下Map接口的关系图和TreeMap的类关系图:
![897e70ea83ff66099e454efe31e19c48.png](https://i-blog.csdnimg.cn/blog_migrate/a43d294b58249e39777e267daaa75a86.jpeg)
![8aa026a83369f9786168b305e34650a7.png](https://i-blog.csdnimg.cn/blog_migrate/0492c0302e37810f95dcaa7b742c3750.jpeg)
可见:TreeMap继承自AbstractMap,实现了NavigableMap、Cloneable和Serializable接口。
其中有一点需要注意,NavigableMap继承自SortedMap,而SortedMap接口就是TreeMap中对象有序的核心。
SortedMap接口是干嘛的?简单来说SortedMap接口中包含Comparator比较器,可以自定义比较方法用于实现key的比较。即实现SortedMap的类,其中的对象即可根据比较器中定义的方法,对key进行排序从而达到类中对象有序的目的。
目前java中SortedMap接口的实现类只有TreeMap。如果对Comparable和Comparator还不太熟悉,可以看看下面的内容,否则可以pass掉。
Comparable 和 Comparator的区别:
首先,Comparable和Comparator都是用于比较的接口,全名:java.lang.Comparable 和 java.util.Comparator
Comparable接口主要用于自然比较,里面只有一个方法:public int compareTo(T o);
Integer、String都实现了Comparable接口并实现了接口中的compareTo方法,Integer中的compareTo方法如下:
public int compareTo(Integer anotherInteger) { ret