Comparable和Comparator接口

目录

Comparable接口

Comparator接口(比较器)

Comparable接口和Comparator的比较

总结


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额解耦,在不修改比较类的同时实现排序,因此更像是“对外”提供排序的接口。

猜你喜欢

转载自blog.csdn.net/weixin_64450588/article/details/127937436