目录
Comparable接口
Comparator接口(比较器)
Comparable接口和Comparator的比较
总结
作用:实现对引用数据类型的比较和排序
使用:待比较类实现接口并且覆写接口中的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;}@Overridepublic String toString() {return "姓名:" + name + " 年龄:" + age; }
}
对于上述的Person类,现在有四个实例化对象,现在要对这四个实例化对象通过使用Comparable接口按照年龄或者其他属性进行排序,那么就需要Person类实现Comparable接口并且覆写compareTo方法:
public class Person implements Comparable {....@Overridepublic 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() {@Overridepublic 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额解耦,在不修改比较类的同时实现排序,因此更像是“对外”提供排序的接口。
下一篇:创建自己的函数库