TreeSet
- 不重复、无索引、可排序
- 可排序:按照元素的默认规则(由小到大)排序
- TreeSet集合底层是基于红黑树的数据结构实现排序的,增删改查性能都较好
源码
//构造
publicTreeSet() {
this(new TreeMap<>());
}
TreeSet两种排序方式
- 对于数值类型:Integer、Double,默认按照从小到大的顺序进行排序
- 对于字符、字符串类型:按照字符在ASCII码中的数字升序进行排序
默认排序/自然排序
Javabean类实现Comparable接口指定比较规则
public class Student implements Comparable<Student>{
...
@Override
public int compareTo(Student o) {
return this.getAge() - o.getAge();
}
}
- this:表示当前要添加的元素
- o:表示已经在红黑树中的元素
- 返回值
- 负数:认为要添加的元素是小的,存左边
- 正数:认为要添加的元素是大的,存右边
- 0:认为要添加的元素已经存在,舍弃
比较器排序
创建TreeSet对象的时候,传递比较器Comparator指定规则
TreeSet<String> ts = new TreeSet<>((new Comparator<String>){
@Override
public int compare(String o1, String o2) {
int i = o1.length() - o2.length();
i = i == 0 ? o1.compareTo(o2) : i;
return i;
}
});
//改写成Lambda表达式形式
TreeSet<String> ts = new TreeSet<>((o1, o2) -> {
int i = o1.length() - o2.length();
i = i == 0 ? o1.compareTo(o2) : i;
return i;
}
);
- o1:当前要添加的规则
- o2:已经在红黑树中存在的元素
- 返回值的规则与之前一样
使用原则:默认使用默认排序,如果默认排序不能满足当前需求,就使用比较器排序
当两种方式同时存在时,以比较器排序为准