1、元素不能重复。
2、具有排序功能。
3、TreeSet中的元素必须实现Comparable接口并重写compareTo()方法(或者通过TreeSet的构造函数指定一个自定义的比较器),TreeSet判断元素是否重复 、以及确定元素的顺序靠的都是这个方法。
①对于java类库中定义的类,TreeSet可以直接对其进行存储,如String,Integer等,因为这些类已经实现了Comparable接口;
②对于自定义类,如果不做适当的处理,TreeSet中只能存储一个该类型的对象实例,否则无法判断是否重复。
4、依赖TreeMap。
5、相对HashSet,TreeSet的优势是有序,劣势是相对读取慢。根据不同的场景选择不同的集合。
类图:
类结构:
public class TreeSet<E> extends AbstractSet<E>
implements NavigableSet<E>, Cloneable, java.io.Serializable
{
//使用NavigableMap对象的key来保存Set集合的元素。
private transient NavigableMap<E,Object> m;
// 使用PRESENT作为Map集合中的value。
private static final Object PRESENT = new Object();
构造函数
// 将TreeMap赋值给 "NavigableMap对象m"
TreeSet(NavigableMap<E,Object> m) {
this.m = m;
}
// 不带参数的构造函数。以自然排序方法创建一个空的TreeMap
public TreeSet() {
this(new TreeMap<E,Object>());
}
// 带比较器的构造函数。以定制排序的方式创建一个新的TreeMap。
public TreeSet(Comparator<? super E> comparator) {
this(new TreeMap<>(comparator));
}
// 创建TreeSet,并将集合c中的全部元素都添加到TreeSet中
public TreeSet(Collection<? extends E> c) {
this();
// 将集合c中的元素全部添加到TreeSet中
addAll(c);
}
// 创建TreeSet,并将s中的全部元素都添加到TreeSet中
public TreeSet(SortedSet<E> s) {
this(s.comparator());
addAll(s);
}
add
实际调用TreeMap put方法
public boolean add(E e) {
return m.put(e, PRESENT)==null;
}
remove
实际调用TreeMap remove方法
public boolean remove(Object o) {
return m.remove(o)==PRESENT;
}
参考: