注:TreeSet 是由 TreeMap 实现的
1.简介
- TreeMap 是一个有序的key-value集合,它是通过红黑树实现的。
- TreeMap基于红黑树(Red-Black tree)实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。
- TreeMap是线程非同步的。
2.构造器
注:
- 当我们使用无参构器时,创建的TreeMap仍是无序的
- 我们可以传入一个自己编写的比较器(匿名内部类)去指定排序规则
1. 构造器,把传入的实现了 Comparator 接口的匿名内部类(对象),传给TreeMap的comparator
public TreeMap(Comparator<? super K> comparator) {
this.comparator = comparator;
}
3.添加机制(指定构造器)
调用put方法
2.1 第一次添加,把 k-v 封装到 Entry 对象,放入root
Entry<K,V> t = root;
if (t == null) {
compare(key, key); // type (and possibly null) check
root = new Entry<>(key, value, null);
size = 1;
modCount++;
return null;
}
2.2 以后添加
Comparator<? super K> cpr = comparator;
if (cpr != null) {
do { //遍历所有的key , 给当前key找到适当的位置
parent = t;
cmp = cpr.compare(key, t.key); //动态绑定到我们的匿名内部类的compare
if (cmp < 0)
t = t.left;
else if (cmp > 0)
t = t.right;
else //如果遍历过程中,发现准备添加 key 和当前已有的 key 相等,就不添加
return t.setValue(value);
} while (t != null);
}
注:如何决定使用 HashMap 还是 TreeMap?
- 对于在Map中插入、删除和定位元素这类操作,HashMap是最好的选择。
- 然而,假如你需要对一 个有序的key集合进行遍历,TreeMap是更好的选择。基于你的collection的大小,也许向 HashMap中添加元素会更快,将map换为TreeMap进行有序key的遍历。