Comparable和Comparator接口
创始人
2024-04-10 01:50:14

目录

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;}@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接口(比较器)

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以able结尾,更代表着一种功能,例如上述的Person类在实现Comparable接口后可以理解为Person类的对象之间具有了比较的功能
  • Comparator意为比较器,更像一种用于比较的工具或者说是比较的参与者。

用法的区别

  • 使用Comparable接口来实现对象之间的比较或者排序,就必须在对象对应类中实现Comparable接口并且覆写compareTo方法
  • 使用Comparator接口来实现对象的排序,可以使用匿名内部类在排序类的外部实现Conparator接口并且重写compare方法

应用场景区别

  • 使用Comparable接口实现排序,必须对排序类的内部进行操作
  • 使用Comparator比较器接口可以实现比较对象和比较器的解离,在类的外部通过匿名内部类进行对象间的比较

总结

Comparable和Comparator接口都可以用于自定义对象之间的比较排序,不同的是,使用Comparable接口必须操作比较类,需要覆写compareTo方法,这样当使用第三方提供的类进行对象的排序时,就很难进行操作;而使用Comparator接口可以不用再操作比较类而通过匿名内部类覆写compare方法实现比较对象的排序。所以Comparable更像是“对内”进行排序的接口,而Compator比较器实现了与比较类d额解耦,在不修改比较类的同时实现排序,因此更像是“对外”提供排序的接口。

相关内容

热门资讯

最新或2023(历届)辽宁高考...   最新或2023(历届)辽宁高考文科二本分数线预测:483分左右  最新或2023(历届)全省高考...
最新或2023(历届)辽宁高考... 最新或2023(历届)辽宁高考文科一本分数线预测:545分左右  最新或2023(历届)全省高考人数...
最新或2023(历届)沈阳药科... 沈阳药科大学是一所具有光荣革命传统的学校,1931年诞生于江西瑞金,是我国历史最悠久的综合性药科大学...
最新或2023(历届)辽宁中医... 9月10日,学校举行最新或2023(历届)级新生开学典礼暨军训汇报表演。校领导班子成员、各学院领导、...
最新或2023(历届)大连医科... 大连医科大学创建于1947年,原校名为关东医学院。1950年更名为大连医学院,1969年举校南迁贵州...