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

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

TreeMap的主要参数以下数据结构

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

能够先看一下Entry的结构排序

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

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

能够将treemap的节点想象成以下的结构内存

PS:是否是和二叉树里面的节点感受很像io

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的数据结构其实是红黑树

相关文章
相关标签/搜索