Java中的Comparable和Comparator接口

转自:https://www.cnblogs.com/xujian2014/p/5215082.html

一.Comparable简介

 Comparable是排序接口。若一个类实现了Comparable接口,就意味着该类支持排序。实现了Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序。
 该接口定义如下:

package java.lang;
import java.util.*;
public interface Comparable<T> {
    public int compareTo(T o);
}

 T表示可以与此对象进行比较的那些对象的类型。
 此接口只有一个方法compareTo,比较此对象与指定对象的顺序,如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
 现在我们假设一个Person类,代码如下:

public class Person  implements Comparable<Person>{
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    @Override
    public int compareTo(Person o) {
        return this.age-o.age;//排序指标是age
    }
    
    public static void main(String[] args){
        Person[] people=new Person[]{new Person("Mary", 25),new Person("Tony", 22)};
        System.out.println("Before Sorting:");
        for (Person person : people){
            System.out.println(person.getName()+"-"+person.getAge());
        }
        Arrays.sort(people);
        System.out.println("After Sorting:");
        for (Person person : people){
            System.out.println(person.getName()+"-"+person.getAge());
        }
    }
}

 输出:

Before Sorting:
Mary-25
Tony-22
After Sorting:
Tony-22
Mary-25

二.Comparator简介

 Comparator是比较接口,我们如果需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口),那么我们就可以建立一个“该类的比较器”来进行排序,这个“比较器”只需要实现Comparator接口即可。也就是说,我们可以通过实现Comparator来新建一个比较器,然后通过这个比较器对类进行排序。该接口定义如下:

package java.util;
public interface Comparator<T> {
    int compare(T o1, T o2);
    boolean equals(Object obj);
 }

注意:
1.若一个类要实现Comparator接口:它一定要实现compare(T o1, T o2) 函数,但可以不实现 equals(Object obj) 函数。
2.int compare(T o1, T o2) 是“比较o1和o2的大小”。返回“负数”,意味着“o1比o2小”;返回“零”,意味着“o1等于o2”;返回“正数”,意味着“o1大于o2”。
 现在假如上面的Person类没有实现Comparable接口,该如何比较大小呢?我们可以新建一个类,让其实现Comparator接口,从而构造一个“比较器"。

public class PersonCompartor implements Comparator<Person> {
    @Override
    public int compare(Person o1, Person o2) {
        return o1.getAge()-o2.getAge();
    }
}

 现在我们就可以利用这个比较器来对其进行排序:

public class Person  {
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    public static void main(String[] args){
        Person[] people=new Person[]{new Person("Mary", 25),new Person("Tony", 22)};
        System.out.println("Before Sorting:");
        for (Person person : people){
            System.out.println(person.getName()+"-"+person.getAge());
        }
        Arrays.sort(people,new PersonCompartor());
        System.out.println("After Sorting:");
        for (Person person : people){
            System.out.println(person.getName()+"-"+person.getAge());
        }
    }
}

 能得到和之前同样的输出。

三.Comparable和Comparator区别比较

 Comparable和Comparator接口均可以用来对某个对象数组或集合按照某个指标进行排序,但是它俩有一些不同。
 Comparable是排序接口,涉及一个对象类、比较器类,比较方法为compareTo(Object o),排序方法为一个参数的Collections.sort()或Arrays.sor()方法,使用简单但需修改对象类源码;而Comparator是比较接口,涉及两个类包括对象类、比较器类,比较方法为compare(Object o1,Object o2),排序方法为两个参数的Collections.sort()或Arrays.sor()方法,无需修改源码。
 值得一提的是像byte,short,int,long,double,float,char等基本数据类型都实现了Comparable接口.

猜你喜欢

转载自blog.csdn.net/DavidHuang2017/article/details/85261773