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