面试的时候,手撕了一道关于自定义对象比较的题,磕磕绊绊才写了出来。看来自己对这两个接口的认识还是不够,特此纪念。
1.Comparable
首先看他的源码,超级简单。其实他的使用,在官方的注释中已经说得非常清楚了。
/**
*本接口用于实现类对象的自然排序(自然排序是一种升序排序)
*实现了本接口的类的对象可以使用Collections.sort(obj),Arrays.sort(obj)进行排序,
*同时,也可以作为SortedSet,SortedMap的key键,而不需要特定实现一个Comparator比较器
**/
public interface Comparable<T> {
//如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。 根据不同类的实现返回不同,大部分返回1,0和-1三个数
public int compareTo(T o); //比较此对象与指定对象的顺序。O为要比较的对象
}
通常是用于使得自定义类型具有可比性。
举例:比较两个学生类对象,大小根据其成绩确定,成绩相等时,根据姓名字母序比较
public class Student implements Comparable<Student> {
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public Student(String name, int score){
this.name = name;
this.score = score;
}
private String name;
private int score;
@Override
public int compareTo(Student o) {
//升序
if(this.score==o.score){
return this.name.compareTo(o.name);
}
//return this.score - o.score; //返回负数表示该对象比较小,0表示相等,正数表示比较大
return this.score - o.score;
}
public static void main(String[] args) {
Student stu1 = new Student("Li",80);
Student stu2 = new Student("Ahang",80);
stu1.compareTo(stu2);
}
}
可以直接使用Collections.sort(list);
2.Comparator
一个比较器,用于定义比较规则,通常重写其compare方法
public interface Comparator<T> {
...
int compare(T o1, T o2);
...
}
还是上面的例子
class StuCom implements Comparator<Student> {
@Override
public int compare(Student o1, Student o2) {
if(o1.getScore() == o2.getScore()){
return o1.getName().compareTo(o2.getName());
}
return o1.getScore() - o2.getScore();
}
}
使用时需要将比较器的实例传入 Collections.sort(list,new StuCom());