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