Comparable简介:
Comparable 是一个排序接口。
若一个类实现了Comparable接口,就意味着“该类支持排序比较”。此外,“实现Comparable接口的类的对象”可以用作“有序映射(如TreeMap)”中的键或“有序集合(TreeSet)”中的元素,而不需要指定比较器。
接口中通过重写compareTo方法来实现x和y的大小比较。语法: x.compareTo(y);
若返回负数,意味着x比y小;返回零,意味着x等于y;返回正数,意味着x大于y。
Comparator简介:
Comparator 是比较器接口。我们若需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口);那么,我们可以建立一个“该类的比较器”来进行排序。这个“比较器”只需要实现Comparator接口即可。也就是说,我们可以通过新建一个类,这个类实现了Comparator接口。我们可以通过这个类,来 new 出一个比较器。
语法:int compare(T o1, T o2);
定义排序规则后返回正数,零和负数分别代表大于,等于和小于。
两者的联系:
Comparable相当于 ”内部比较器“ ;Comparator相当于“外部比较器”。
代码实现:
Comprarable:
public class People implements Comparable<People> {
private String name;
private int age;
public People(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(People o) {
return this.age - o.age;
}
@Override
public String toString() {
return "People{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public static void main(String[] args) {
People P1 = new People("张三",19);
People P2 = new People("李四",25);
System.out.println(P1);
System.out.println(P2);
int tmp = P1.compareTo(P2);
if(tmp < 0){
System.out.println(P1 + " 小于 "+ P2);
}else if(tmp == 0){
System.out.println(P1 + " 等于 "+ P2);
}else {
System.out.println(P1 + " 大于 "+ P2);
}
}
}
运行结果:
Comparator:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
/**
* @Author yzh
* @Date 2022/11/3 11:39
*/
public class Person2{
private String name;
private int age;
public Person2(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person2{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
// 创建一个类来实现 Comparator 接口,因此可以实例化一个比较器;
static class 实现比较器的类 implements Comparator<Person2>{
@Override
public int compare(Person2 o1, Person2 o2) {
return o1.age - o2.age;
}
}
public static void main(String[] args) {
Person2[] array = {
new Person2("张伟",25),
new Person2("刘能",50),
new Person2("赵四",55),
new Person2("王五",44)
};
实现比较器的类 c1 = new 实现比较器的类();
Arrays.sort(array,c1);
System.out.println(Arrays.toString(array));
}
}
运行结果:
排序完成。
总结
Comparable和Comparator都可以用来进行比较、排序。
Comparable可以直接在需要进行排序的类中实现,重写compateTo(T o)方法;
而Comparator需要另外顶一个实现Comparator接口的实现类来作为“比较器”。
二者各有优缺点,用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码。 用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以提高代码的复用性了。