Java TreeSet

316 阅读1分钟

TreeSet

  • 不重复、无索引、可排序
  • 可排序:按照元素的默认规则(由小到大)排序
  • TreeSet集合底层是基于红黑树的数据结构实现排序的,增删改查性能都较好

源码

//构造
publicTreeSet() {
    this(new TreeMap<>());
}

TreeSet两种排序方式

  • 对于数值类型:Integer、Double,默认按照从小到大的顺序进行排序
  • 对于字符、字符串类型:按照字符在ASCII码中的数字升序进行排序

Snipaste_2022-11-06_21-07-50.png

默认排序/自然排序

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:已经在红黑树中存在的元素
  • 返回值的规则与之前一样

使用原则:默认使用默认排序,如果默认排序不能满足当前需求,就使用比较器排序

当两种方式同时存在时,以比较器排序为准