Java解惑之Comparable和Comparator

首先,两者都是比较器,主要用来对集合进行排序。
废话不多说,直接上代码,来看看两者的区别

Comparable

public interface Comparable {
    public int compareTo(T o);
}

可以看出Comparable是一个接口,里面只有一个方法compareTo

public class Student implements Serializable, Comparable {

  private static final long serialVersionUID = 1L;

  public int age;
  public int num;
  public String name;
  public Book1 book;

public int compareTo(Student o) {
    if (this.age > o.age) {
        return 1;
    } else {
        return -1;
    }
  }
}

public class Test6 {

  public static void main(String[] args) {
    Student s1=new Student();
    s1.age=18;
    Student s2=new Student();
    s2.age=16;
    Student s3=new Student();
    s3.age=20;
    
    List list=new ArrayList();
    list.add(s1);
    list.add(s2);
    list.add(s3);
    Collections.sort(list);
    for(int i=0;i

输出结果

16
18
20

结果分析
我们知道ArrayList的输出顺序应该是输入的顺序,但由于Student类实现了Comparable接口,并且重写了compareTo方法,故在方法内部将Student按照age排序了。

Comparator

@FunctionalInterface
public interface Comparator {
   int compare(T o1, T o2);
   。。。。其他方法
}

Comparator也是一个接口,不过里面有很多方法,我们只需要关心其中一个方法compare(Student o1, Student o2)即可

这里有个疑问?
我们都知道,接口中的方法必须是抽象的,但这个Comparator虽然是接口,但它的方法确有body。

public class StudentComparator implements Comparator {

public int compare(Student o1, Student o2) {
    if (o1.age > o2.age) {
        return 1;
    } else {
        return -1;
    }
  }
}

public class Test6 {

  public static void main(String[] args) {
    Student s1=new Student();
    s1.age=18;
    Student s2=new Student();
    s2.age=16;
    Student s3=new Student();
    s3.age=20;
    
    List list=new ArrayList();
    list.add(s1);
    list.add(s2);
    list.add(s3);
    Collections.sort(list,new StudentComparator());
    for(int i=0;i

输出结果

16
18
20

结果分析
通过实现Comparator也可以实现排序

总结一下Comparable和Comparator的区别

  • 前者需要待排序的类实现该接口,后者是方法调用的一个参数
  • 前者实现compareTo方法,后者实现compare方法
  • 总体上区别不大,哪个顺手用哪个即可,不过有一点,并不是所有的类都是可修改的,这时就可以通过Comparator接口来实现对该类的排序。

你可能感兴趣的:(Java解惑之Comparable和Comparator)