TreeSet源码分析
功能:将Set中的元素按照一定的规则进行排序存储。
在其源码的内部实现中(如下),可以看到TreeSet时借助了TreeMap来实现的。
public TreeSet() {
this(new TreeMap<E,Object>());
}
TreeSet(NavigableMap<E,Object> m) {
this.m = m;
}
TreeSet.add方法
public boolean add(E e) {
// private static final Object PRESENT = new Object();
return m.put(e, PRESENT)==null;
}
从add方法中可以看到直接将e其作为key,value = new Object() 保存在了TreeMap中。
下面来看一下TreeMap类中put方法的内部实现哈
public TreeMap() {
comparator = null;
}
TreeMap.put(key,value)的实现思想比较简单:
1)就是实现了一个二叉排序树:要么是空树,要么满足以下条件:若左子树不空,则左子树所有结点的值均小于根结点的值,若右子树不空,右子树所有结点的值均大于根结点的值;左子树和右子树也是一颗二叉排序树。
2)具体为:从root节点开始遍历,利用比较器comparator来比较node.key与key的大小来确定此key应该存放的位置。注意:comparator可能为null,如果为null,则使用key的natural ordering(自然顺序),例如:没有指定comparator的String 类型key 的结果就是字典排序。
public V put(K key, V value) {
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++;