一、TreeSet 概述
-
1、
TreeSet
是SortedSet
接口的实现类,TreeSet
可以确保集合元素处于排序状态。 -
2、
TreeSet
顾名思义他内部维护的是一个TreeMap
,底层是红黑二叉树,他使得集合内都是有序的序列。 -
3、
Tree
可以按照添加对象的指定属性,进行排序,所以向TreeSet
中添加的数据,要求是相同类的对象。 -
4、两种排序方式:自然排序(实现
Comparable接口
) 和 定制排序(Comparator
); -
5、自然排序中,比较两个对象是否相同的标准为:
compareTo()
返回0.不再是equals()
; -
6、定制排序中,比较两个对象是否相同的标准为:
compare()
返回0.不再是equals()
; -
7、对
TreeSet
进行遍历的时候,默认是使用自然排序的规则来排序的; -
8、
TreeSet
添加自定义类的对象时候,必须要有自然排序或定制排序,否则抛出异常:cannot cast to java.lang.Comparable
;
二、TreeSet 结构
1、TreeSet 声明
1 public class TreeSet<E> extends AbstractSet<E>
2 implements NavigableSet<E>, Cloneable, java.io.Serializable
2、TreeSet 类继承结构
3、红黑树
TreeSet
和后要的TreeMap
采用红黑树的存储结构
特点:有序,查询速度比List快
三、TreeSet 创建
1、构造器
TreeSet
是基于红黑树结构实现的,会对元素进行排序,TreeSet 提供了五种构造器:
public TreeSet() {
this(new TreeMap<E,Object>());
}
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);
}
里面的 m 属性是什么:
/**
* The backing map.
*/
private transient NavigableMap<E,Object> m;
// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
//加入Java开发交流君样:593142328一起吹水聊天
可以看到里面是维护了一个 NavigableMap。
2、通过 Comparator 实例创建 TreeSet
上面的四个构造函数中着重要介绍第三个,它通过Comparator
实例来创建TreeMap
,那么Comparator
到底是何方神圣呢?
通过阅读Comparator
的源码发现,这是一个用于集合类排序的辅助接口,用户需要实现compare方法。
如果用户用了这种方式创建TreeSet
,那么集合元素就不需要做额外处理,否则集合元素都需要实现Comparable
接口,因为Tree
在排序的时候会调用compare
或者compareTo
方法(介绍TreeMap
的时候会具体讲解)。
下面来看看写的一个样例代码:
public class MyComparator implements Comparator<Person> {
@Override
public int compare(Person o1, Person o2) {
return o1.age - o2.age;
}
}
public class Person {
public Integer age;
public Person(Integer value) {
this