我们知道Set系列的集合的存储特点是元素无序,不重复,但是TreeSet基于平衡二叉树实现,底层存储数据有要求,分别是以下两点 存储数据有自然顺序。存储数据比较方式。这个比较方式就是我们今天所说的重点了,两个比较对象,下来咱们来看看他们的使用场景和区别
一:Comparable
这个类位于java.lang包中, Comparable是排序接口,若一个类实现了Comparable接口,就意味着“该类支持排序”。. 而Comparator是比较器,我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。. Comparable相当于“内部比较器”,相当于给实体类本身添加排序功能
例如:常见一个实现Comparable接口的Teacher类,重写比较方法compare To,按照年龄升序
public class Teacher implements Comparable<Teacher>{
private Integer id;
private String name;
private Integer age;
public Teacher () {
}
public Teacher(Integer id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Teacher{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Teacher o) {
return age - o.age;
}
}
创建测试类Demo1
public class Demo1 {
public static void main(String[] args) {
Set<Teacher> list = new TreeSet<>();
list.add(new Teacher(1,"王五",33));
list.add(new Teacher(2,"张五",43));
list.add(new Teacher(3,"里五",23));
list.add(new Teacher(4,"肖五",3));
System.out.println(list);
}
}
执行结果如下

如图,我们可以看见,该类已经按照年龄降序了。说明我们重写的Compara To比较方法已经生效
二:Comparator
Comparator是比较接口,我们如果需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口),那么我们就可以建立一个“该类的比较器”来进行排序,这个“比较器”只需要实现Comparator接口即可。也就是说,我们可以通过实现Comparator来新建一个比较器,然后通过这个比较器对类进行排序。我们需要注意的是
若一个类要实现Comparator接口:它一定要实现compare(T o1, T o2) 函数,但可以不实现 equals(Object obj) 函数。 2、int compare(T o1, T o2) 是“比较o1和o2的大小”。返回“负数”,意味着“o1比o2小”;返回“零”,意味着“o1等于o2”;返回“正数”,意味着“o1大于o2”。现在假如上面的Teacher类没有实现Comparable接口,该如何比较大小呢?我们可以新建一个类,让其实现Comparator接口,从而构造一个“比较器"。
//自定义比较器对象
public class Demo2 implements Comparator<Teacher> {
@Override
public int compare(Teacher o1, Teacher o2) {
return o1.getAge()- o2.getAge();//返回
}
public static void main(String[] args) {
Set<Teacher> teachers = new TreeSet<>();
teachers.add(new Teacher(1,"张三",45));
teachers.add(new Teacher(2,"李四",5));
teachers.add(new Teacher(3,"王五",456));
teachers.add(new Teacher(4,"赵六",65));
System.out.println(teachers);
}
}
排序结果如下

我们可以看见,已经按照年龄升序了