Java解惑之Comparable和Comparator

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

Comparable

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

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

public class Student implements Serializable, Comparable<Student> {

  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<Student> list=new ArrayList<Student>();
    list.add(s1);
    list.add(s2);
    list.add(s3);
    Collections.sort(list);
    for(int i=0;i<list.size();i++){
        System.out.println(list.get(i).age);
    }
  }
}

输出结果

16
18
20

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

Comparator

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

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

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

public class StudentComparator implements Comparator<Student> {

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<Student> list=new ArrayList<Student>();
    list.add(s1);
    list.add(s2);
    list.add(s3);
    Collections.sort(list,new StudentComparator());
    for(int i=0;i<list.size();i++){
        System.out.println(list.get(i).age);
    }
  }
}

输出结果

16
18
20

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

总结一下Comparable和Comparator的区别

  • 前者需要待排序的类实现该接口,后者是方法调用的一个参数
  • 前者实现compareTo方法,后者实现compare方法
  • 总体上区别不大,哪个顺手用哪个即可,不过有一点,并不是所有的类都是可修改的,这时就可以通过Comparator接口来实现对该类的排序。
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 34,853评论 18 399
  • 1.import static是Java 5增加的功能,就是将Import类中的静态方法,可以作为本类的静态方法来...
    XLsn0w阅读 1,442评论 0 2
  • 面向对象主要针对面向过程。 面向过程的基本单元是函数。 什么是对象:EVERYTHING IS OBJECT(万物...
    sinpi阅读 1,228评论 0 4
  • 如果世上有后悔药的话,那么就不会有那么多的怨念了吧…… 一开始的时候我们只需要一个细微的眼神些许的肯定就能对人萌生...
    芳啦啦啦阅读 219评论 0 0
  • 13白起王翦列传 白起(?-前257) 陕西人,善于用兵,被魏冉举用,侍奉秦昭王。 前294年,魏冉为国相,左庶长...
    面包马戏团阅读 1,385评论 2 11

友情链接更多精彩内容