Java中Comparable和Comparator的区别

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

Java中Comparable和Comparator的区别

经典鸡翅   2020-03-29 我要评论
### 前言 最近复习遇到了这个问题,在此进行一个详细的记录,分享给大家。 ### 两个接口的区别 #### 包区别 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{ //属性 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 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 { //不一定要自然排序即升序,可以反过来写成降序 @Override public int compare(Staff o1, Staff o2) { //降序 /*if(o1.getSalary()>o2.getSalary()){ return -1; } if(o1.getSalary()o2.getSalary()){ return 1; } if(o1.getSalary()o2.getAge()){ return -1; } if(o1.getAge()o2.getSalary()){ return 1; } if(o1.getSalary() 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); } } } ``` ### 总结 两种接口的最主要区别还是一个对象自己实现和后期实现的区别。

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们