Java中Comparable与Comparator

引言

Comparable和Comparator都是用来实现集合中元素的比较、排序的。使用Comparable需要修改原先的实体类,而Comparator 不用修改原先的类直接去实现一个新的比较器 ,因此Comparator实际应用更加广泛。

区别:

1.包所在的位置不同

        Comparable是位于java.lang下,不需要手动导入

        Comparator是位于java.util下,需要手动导入

2.实现方式不同

        Comparable是在集合内部定义的方法实现的排序。Comparable 是一个对象本身就已经支持自比较所需要实现的接口(如 String、Integer 自己就可以完成比较大小操作,已经实现了Comparable接口),对自己写的类实现这一接口来实现按自己规则排序。

        实现comparable 必然要重写compareTo(T o)方法。实现了Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序。

package test;
import java.util.Arrays;
class Student  implements Comparable{
    private String name; //学生姓名
    private int age;    //学生年龄
    public Student(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public int getAge() {
        return age;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    @Override
    public String toString() {
        return "Student{" + "name='" + name + '\'' + ", age=" + age + '}';
    }
    @Override
    public int compareTo(Student o) {
        //return this.age-o.age;//升序
        return o.age-this.age;//降序
    }
}
//测试类
class TestStudent {
    public static void main(String[] args) {
        Student student1 = new Student("小明",12);
        Student student2 = new Student("小红",10);
        Student student3 = new Student("小刘",15);
        Student[] student = {student1,student2,student3};
        Arrays.sort(student);
        for (Student s:student) {
            System.out.println(s);
        }
    }
}

 效果图:

Java中Comparable与Comparator_第1张图片

 

        Comparator是在集合外部实现的排序。当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。

        实现了Comparator接口的类,一定要实现compare(T o1,T o2)方法

package test;
import java.util.Arrays;
import java.util.Comparator;
class Student  {
    private String name; //学生姓名
    private int age;    //学生年龄
    public Student(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public int getAge() {
        return age;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    @Override
    public String toString() {
        return "Student{" + "name='" + name + '\'' + ", age=" + age + '}';
    }
}
//内部类实现Comparator接口重写compare方法,实现按年龄升序排列
class StudentCom implements Comparator {
    @Override
    public int compare(Student o1, Student o2) {
        return o1.getAge() - o2.getAge();
    }
}
//测试类
class TestStudent {
    public static void main(String[] args) {
        Student student1 = new Student("小明",12);
        Student student2 = new Student("小红",10);
        Student student3 = new Student("小刘",15);
        Student[] student = {student1,student2,student3};
        StudentCom sc = new StudentCom();
        Arrays.sort(student,sc);
        for (Student s:student) {
            System.out.println(s);
        }
    }
}

效果图:

 Java中Comparable与Comparator_第2张图片

 3.Comparator与Comparable同时存在的情况下,比较器Comparator优先级高

 相同点:

  1. 两者都是用来用作对象之间的比较,都可以自定义比较规则;
  2. 两者都是返回一个描述对象之间关系的int;

你可能感兴趣的:(java知识点,java,开发语言)