概述
在阅读本文时,强烈建议读者先学习TreeMap或者ConcurrentHash的相关知识:
Java集合-TreeMap深入浅出源码分析Java8
ConcurrentHashMap与红黑树实现分析Java8
来看下TreeSet源码上的英文说明:
A NavigableSet implementation based on a TreeMap.
The elements are ordered using their Comparable natural
ordering, or by a Comparator provided at set creation
time, depending on which constructor is used.
This implementation provides guaranteed log(n) time cost for the basic
operations add, remove and contains
两个信息:
1、TreeSet默认情况下是基于TreeMap实现的,是对TreeMap的封装。
2、默认情况下和TreeMap一样,采用元素的内部比较器Comparable的compareTo方法来比较元素的大小。
3、如果不用内部比较器,就需要在外部传入一个Comparator的实现类来比较。
4、由于TreeMap实现中采用红黑树实现,所以add,remove,contains方法的时间复杂度最坏情况下能保证log( n )。
类的继承关系和构造方法
public class TreeSet<E> extends AbstractSet<E>
implements NavigableSet<E>, Cloneable, java.io.Serializable
{
// 存放元素的Map,必须是实现了NavigableMap接口的类
private transient NavigableMap<E,Object> m;
// 一个虚拟值,用于添加元素到map中时,key为元素的值,value用此虚拟值代替
private static final Object PRESENT = new Object();
// 默认构造方法用TreeMap来实现
public TreeSet() {
this(new TreeMap<E,Object>());
}
// 也可以自定义实现了NavigableMap接口的Map来作为实现
TreeSet(NavigableMap<E,Object> m) {
this.m = m;
}
public TreeSet(Comparator<? super E> comparator) {
this(new TreeMap<>(comparator));
}
public TreeSet(Collection<? extends E> c) {
this();
addAll(c);
}
public TreeSet(SortedSet<E> s) {
this(s.comparator());
addAll(s);
}
}
从源码看,TreeSet继承自AbstractSet,并实现了NavigableSet接口。其大部分构造方法都是以TreeMap来实现,也支持自定义的Map来实现,当然我们都建议不用自定义的Map。
基本操作
public boolean add(E e) {
return m.put(e, PRESENT)==null;
}
public int size() {
return m.size();
}
public boolean isEmpty() {
return m.isEmpty();
}
public boolean contains(Object o) {
return m.containsKey(o);
}
public boolean remove(Object o) {
return m.remove(o)==PRESENT;
}
public void clear() {
m.clear();
}
基本操作都是调用TreeMap的方法来实现。
网友评论