Collection源码分析(六):TreeMap源码分析

TreeMap继承 AbstractMap并实现了NavigableMap<K,V>, Cloneable, java.io.Serializable 接口

TreeMap的主要参数如下

一个comparator比较器,一个名字叫root的节点,size:Map元素个数 modCount 构造树的次数

可以先看一下Entry的结构

除了key value之外 还有一个left变量 right变量 和一个parent变量 这个结构和Map的Entry不太一样 

还有一个color属性此处后面再说

可以将treemap的节点想象成如下的结构

PS:是不是和二叉树里面的节点感觉很像

TreeMap的构造器如下

只是将比较器赋值为null

首先我们来看看treeMap是怎么构建结构的先看put方法

在上述的代码中

1.当我们put进第一个元素的时候 此时root元素是Null 走的是第一个if  然后主要工作就是 新建了一个节点 并且将这个节点给到root 注意他的parent节点是空

2.再次放入元素的时候将会进入第二个IF判断 显然易见 我们将会直接走到else里面

第二个IF是做什么用的 是给我们自定义排序使用 当你实例化TreeMap的时候 他有一个带Comparator 的构造器

TreeMap(Comparator<? super K> comparator)

在我们不重新定义比较器的时候 会使用else里的默认比较器 本章以默认为主

比较放入元素的Key与根节点的Key的大小 这里的compareTo方法来自Comparable这个接口

A>B 返回 1 ;A=B 返回 0 ;A<B 返回-1

这里完成的操作就是定位 更具你的元素的KEY值大小 从ROOT节点开始比较 小的话取节点的左侧 大的话取节点的右侧 相等的话 直接赋值  直到定位到叶子节点(是不是很像二叉排序树

找到节点的位置之后

3.新建一个节点 将这个新节点的parent指向 找到的节点 并且把 父节点左右指针更具KEY值比较的结果指向这个新建的节点 可以看到 key值小的 在父节点左 大的 在父节点右

所以我们可以看到 treeMap的结构就是一个二叉排序树的内存结构 在内存中是采用链表的形式去建立上下的关系

注意到 Entry里面还有一个COLOR值  可以看到fixAfterInsertion(Entry)方法

这里就是给TreeMap的元素上色的过程  并且rotateRight以及rotateleft分别是右旋左旋操作 是平衡树的操作

总结 TreeMap的数据结构实际上是红黑树

猜你喜欢

转载自my.oschina.net/u/2970507/blog/1801076