Java中Comparable和Comparator的区别

前言

最近复习遇到了这个问题,在此进行一个详细的记录,分享给大家。

两个接口的区别

包区别

Comparable接口是在java.lang下。
Comparator接口是在java.util下。

使用区别

如果在定义类时,就实现了Comparable接口,直接在里面重写compareTo()方法,如果没实现,后面在业务开发中需要有比较排序的功能,就再单独写一个类实现Comparator接口,在里面重写compare()方法,然后这个类需要作为参数传入到工具类Collections.sort和Arrays.sort方法中。

使用场景

主要用于集合排序Collections.sort和Arrays.sort。

使用Comparable接口的实现方案

在定义类的时候,就实现这个接口,将排序规则定义好。

/**
 * 实体类,实现Comparable接口
 */
public class Person implements Comparable<Person>{

    //属性
    private String name;
    private int age;
    private int salary;

    //get和set方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getSalary() {
        return salary;
    }

    public void setSalary(int salary) {
        this.salary = salary;
    }

    //构造方法
    public Person(String name, int age, int salary) {
        this.name = name;
        this.age = age;
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", salary=" + salary +
                '}';
    }

    //重写接口方法,o为要比较的对象
    @Override
    public int compareTo(Person o) {
        //大于要比较的对象就返回1
        if(this.salary>o.getSalary()){
            return 1;
        }
        //小于则返回-1
        else if(this.salary<o.getSalary()){
            return -1;
        }
        //相等则返回0
        return 0;
    }
}

测试方法:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class TestComparable {

    public static void main(String[] args) {
        //测试Comparable接口
        Person p1=new Person("clyang",18,4000);
        Person p2=new Person("messi",30,8000);
        Person p3=new Person("ronald",32,9000);
        Person p4=new Person("herry",19,7600);
        Person p5=new Person("roben",35,7900);

        //添加到集合
        List<Person> list=new ArrayList<>();
        list.add(p1);
        list.add(p2);
        list.add(p3);
        list.add(p4);
        list.add(p5);

        System.out.println("-----------------排序前-----------------");
        for (Person person : list) {
            System.out.println(person);
        }

        //排序一般使用Collections.sort方法,或者使用Arrays.sort方法,按照比较的元素进行自然排序,即从小到大
        Collections.sort(list);

        System.out.println("-----------------排序后-----------------");
        for (Person person : list) {
            System.out.println(person);
        }

    }
}

使用Comparator

这个接口主要用于实体创建的时候,没有实现接口,但又需要比较的情况。

/**
 * 实体类,不实现Comparable接口,使用单独的Comparator接口
 */
public class Staff {

    //属性
    private String name;
    private int age;
    private int salary;

    public Staff(String name, int age, int salary) {
        this.name = name;
        this.age = age;
        this.salary = salary;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getSalary() {
        return salary;
    }

    public void setSalary(int salary) {
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "Staff{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", salary=" + salary +
                '}';
    }
}

创建接口的实现类

import java.util.Comparator;

/**
 * 单独写的比较器,实现Compartor接口
 */
public class StaffComparator implements Comparator<Staff> {

    //不一定要自然排序即升序,可以反过来写成降序
    @Override
    public int compare(Staff o1, Staff o2) {
        //降序
        /*if(o1.getSalary()>o2.getSalary()){
            return -1;
        }
        if(o1.getSalary()<o2.getSalary()){
            return 1;
        }
        return 0;*/

        //升序
        /*if(o1.getSalary()>o2.getSalary()){
            return 1;
        }
        if(o1.getSalary()<o2.getSalary()){
            return -1;
        }
        return 0;*/

        //先按照年龄倒序排,如果年龄相等比较工资
        if(o1.getAge()>o2.getAge()){
            return -1;
        }
        if(o1.getAge()<o2.getAge()){
            return 1;
        }
        //能到这里说明年龄相等,继续比较工资
        if(o1.getSalary()>o2.getSalary()){
            return 1;
        }
        if(o1.getSalary()<o2.getSalary()){
            return -1;
        }
        return 0;
    }
}

测试方法:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class TestComparator {

    public static void main(String[] args) {
        //测试Comparator接口
        Staff p1=new Staff("clyang",18,4000);
        Staff p2=new Staff("messi",30,8000);
        Staff p3=new Staff("ronald",32,9000);
        Staff p4=new Staff("herry",18,7600);
        Staff p5=new Staff("roben",35,7900);

        //添加到集合
        List<Staff> list=new ArrayList<>();
        list.add(p1);
        list.add(p2);
        list.add(p3);
        list.add(p4);
        list.add(p5);

        System.out.println("-----------------排序前-----------------");
        for (Staff staff : list) {
            System.out.println(staff);
        }

        //排序,需要使用自定义比较类
        Comparator myComparator=new StaffComparator();
        Collections.sort(list,myComparator);

        System.out.println("-----------------排序后-----------------");
        for (Staff staff : list) {
            System.out.println(staff);
        }
    }
}

总结

两种接口的最主要区别还是一个对象自己实现和后期实现的区别。

posted @ 2020-03-29 18:45  经典鸡翅  阅读(645)  评论(0编辑  收藏  举报