目录
Comparable接口
作用:实现对引用数据类型的比较和排序
使用:待比较类实现接口并且覆写接口中的compareTo方法
实例:
public class Person {
private String name;//姓名
private int age;//年龄
public Person(String name,int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "姓名:" + name + " 年龄:" + age;
}
}
对于上述的Person类,现在有四个实例化对象,现在要对这四个实例化对象通过使用Comparable接口按照年龄或者其他属性进行排序,那么就需要Person类实现Comparable接口并且覆写compareTo方法:
public class Person implements Comparable<Person> {
....
@Override
public int compareTo(Person o) {
//return o.age - this.age; //降序排列
return this.age - o.age; //升序排列
}
}
测试:
public class ComparableTestDrive {
public static void main(String[] args) {
Person[] person = new Person[4];
person[0] = new Person("huahua",18);
person[1] = new Person("niuniu",19);
person[2] = new Person("manage",28);
person[3] = new Person("shuaishuai",17);
Arrays.sort(person);
System.out.println(Arrays.toString(person));
}
}
//输出:(年龄升序)
//[姓名:shuaishuai 年龄:17, 姓名:huahua 年龄:18, 姓名:niuniu 年龄:19, 姓名:manage 年龄:28]
Comparator接口(比较器)
Comparator也可用于引用数据类型的排序,相对于Comparable接口有自己独特的优势,Comparator和Compareable接口的比较写在第三部分。
对于上述的Person类,如果使用Comparator接口来实现按年龄或者其他属性来进行排序,可以不用再去操作Person类,而只需要在使用排序方法的时候使用匿名内部类实现其中的compare方法,会发现这种比较方法实现的排序不用再依赖于待比较的类型,实现了比较和对象类型的解离,这样即使再使用非自定义类时,也可以通过该接口实现期望的数据排序。
测试(不用操作Person类):
public class ComparableTestDrive {
public static void main(String[] args) {
Person[] person = new Person[4];
person[0] = new Person("huahua",18);
person[1] = new Person("niuniu",19);
person[2] = new Person("manage",28);
person[3] = new Person("shuaishuai",17);
Arrays.sort(person, new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
//return o2.getAge() - o1.getAge();//降序排列
return o1.getAge() - o2.getAge();//升序排列
}
});
System.out.println(Arrays.toString(person));
}
}
//输出(按年龄升序的结果):
//[姓名:shuaishuai 年龄:17, 姓名:huahua 年龄:18, 姓名:niuniu 年龄:19, 姓名:manage 年龄:28]
Comparable接口和Comparator的比较
字面含义的区别:
- Comparable以able结尾,更代表着一种功能,例如上述的Person类在实现Comparable接口后可以理解为Person类的对象之间具有了比较的功能
- Comparator意为比较器,更像一种用于比较的工具或者说是比较的参与者。
用法的区别:
- 使用Comparable接口来实现对象之间的比较或者排序,就必须在对象对应类中实现Comparable接口并且覆写compareTo方法
- 使用Comparator接口来实现对象的排序,可以使用匿名内部类在排序类的外部实现Conparator接口并且重写compare方法
应用场景区别:
- 使用Comparable接口实现排序,必须对排序类的内部进行操作
- 使用Comparator比较器接口可以实现比较对象和比较器的解离,在类的外部通过匿名内部类进行对象间的比较
总结
Comparable和Comparator接口都可以用于自定义对象之间的比较排序,不同的是,使用Comparable接口必须操作比较类,需要覆写compareTo方法,这样当使用第三方提供的类进行对象的排序时,就很难进行操作;而使用Comparator接口可以不用再操作比较类而通过匿名内部类覆写compare方法实现比较对象的排序。所以Comparable更像是“对内”进行排序的接口,而Compator比较器实现了与比较类d额解耦,在不修改比较类的同时实现排序,因此更像是“对外”提供排序的接口。