最近复习遇到了这个问题,在此进行一个详细的记录,分享给大家。
Comparable接口是在java.lang下。
Comparator接口是在java.util下。
如果在定义类时,就实现了Comparable接口,直接在里面重写compareTo()方法,如果没实现,后面在业务开发中需要有比较排序的功能,就再单独写一个类实现Comparator接口,在里面重写compare()方法,然后这个类需要作为参数传入到工具类Collections.sort和Arrays.sort方法中。
主要用于集合排序Collections.sort和Arrays.sort。
在定义类的时候,就实现这个接口,将排序规则定义好。
/** * 实体类,实现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); } } }
这个接口主要用于实体创建的时候,没有实现接口,但又需要比较的情况。
/** * 实体类,不实现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); } } }
两种接口的最主要区别还是一个对象自己实现和后期实现的区别。