ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java中Comparable和Comparator的区别

2020-03-29 18:58:31  阅读:226  来源: 互联网

标签:salary Comparable Java name Comparator int age list public


前言

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

两个接口的区别

包区别

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);
        }
    }
}

总结

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

标签:salary,Comparable,Java,name,Comparator,int,age,list,public
来源: https://www.cnblogs.com/jichi/p/12593981.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有