目录
作用:实现对引用数据类型的比较和排序
使用:待比较类实现接口并且覆写接口中的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
{ - ....
- @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也可用于引用数据类型的排序,相对于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
() { - @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接口必须操作比较类,需要覆写compareTo方法,这样当使用第三方提供的类进行对象的排序时,就很难进行操作;而使用Comparator接口可以不用再操作比较类而通过匿名内部类覆写compare方法实现比较对象的排序。所以Comparable更像是“对内”进行排序的接口,而Compator比较器实现了与比较类d额解耦,在不修改比较类的同时实现排序,因此更像是“对外”提供排序的接口。