Java中Comparable和Comparator的区别

举报
经典鸡翅 发表于 2022/02/17 23:49:57 2022/02/17
【摘要】 前言 最近复习遇到了这个问题,在此进行一个详细的记录,分享给大家。 两个接口的区别 包区别 Comparable接口是在java.lang下。 Comparator接口是在java.util下。 使用区别 如果在定义类时,就实现了Comparable接口,直接在里面重写compareTo()方法,如果没实现...

前言

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

两个接口的区别

包区别

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

总结

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

文章来源: blog.csdn.net,作者:经典鸡翅,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/hanqing456/article/details/111878962

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。