1. Comparable 和 Comparator区别比较
Comparable 是排序接口,若一个类实现了Comparable接口,就意味着“该类支持排序”。Comparator 是比较器,我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。
Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。
Comparable
实现Comparable接口
重写ComparableTo
2. TreeSet
有两种实现指定排序规则的方式:
- 在存储类本身中实现
Comparable<Object>
接口,并实现该接口的 public int compareTo(Object o) 方法;
@Data @NoArgsConstructor @AllArgsConstructor public class Student implements Comparable<Student>{ private Integer id; private Integer age; private String name; @Override public int compareTo(Student student) { int result = this.id - student.getId(); return result; } }
- 在声明
TreeSet
时用匿名内部类的方式实现。
TreeSet<Student> treeSet = new TreeSet<>(new Comparator<Student>() { @Override public int compare(Student o1, Student o2) { return o1.getAge() - o2.getAge(); } });
当我们往 TreeSet
中存储 String,Integet ,Long 等本身实现了 Comparable<Object>
接口的非自定义类,我们可以不用自己实现其排序规则。
当两种方式都指定了,会优选使用Comparator。