美文网首页
Java解惑之Comparable和Comparator

Java解惑之Comparable和Comparator

作者: sofarsogoo_932d | 来源:发表于2018-04-01 17:04 被阅读0次

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

    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接口来实现对该类的排序。

    相关文章

      网友评论

          本文标题:Java解惑之Comparable和Comparator

          本文链接:https://www.haomeiwen.com/subject/lepocftx.html