TreeMap源码解析!
TreeMap源码解析!
月伴飞鱼TreeMap 底层的数据结构就是红黑树,和 HashMap 的红黑树结构一样。
不同的是:TreeMap 利用了红黑树左节点小,右节点大的性质,根据 key 进行排序。
- 使每个元素能够插入到红黑树大小适当的位置,维护了 key 的大小关系,适用于 key 需要排序的场景。
因为底层使用的是平衡红黑树的结构,所以 containsKey、get、put、remove 等方法的时间复杂度都是
log(n)
。
TreeMap 常见的属性有:
1 | //比较器,如果外部有传进来 Comparator 比较器,首先用外部的 |
新增节点
判断红黑树的节点是否为空,为空的话,新增的节点直接作为根节点:
1 | Entry<K,V> t = root; |
根据红黑树左小右大的特性,进行判断,找到应该新增节点的父节点:
1 | Comparator<? super K> cpr = comparator; |
在父节点的左边或右边插入新增节点:
1 | //cmp 代表最后一次对比的大小,小于 0 ,代表 e 在上一节点的左边 |
1、着色旋转,达到平衡,结束。
2、新增节点时,就是利用了红黑树左小右大的特性,从根节点不断往下查找,直到找到节点是 null 为止。
- 节点为 null 说明到达了叶子结点。
3、查找过程中,发现 key 值已经存在,直接覆盖。
4、TreeMap 是禁止 key 是 null 值的。