我们都知道,实现Comparator和Comparable这两个接口,可以实现对对象比较大小。那这个两个又有什么区别呢?
comparator
1、接口类在java.util包里面,实现接口时需要导入该包。
2、一般新建一个类实现这个接口,用来比较其他对象的大小。实现这个接口时,对象不能把自己和其他对象相比较。
3、实现public int compare(Object o1, Object o2),当实现类使用了泛型时,Object可以换成具体的类型。
1 import java.util.Comparator; 2 3 public class StudentComparator implements Comparator<Student> { 4 @Override 5 public int compare(Student o1, Student o2) { 6 //在这里我们把age作为对象比较大小的依据 7 if (o1.getAge() > o2.getAge()) 8 return 1; 9 else if (o1.getAge()<o2.getAge()) 10 return -1; 11 return 0;//如果两个对象相等,返回0 12 } 13 }
comparable
1、接口类在java.lang包里面,实现接口时无需导包。
2、一般是需要比较大小的类直接实现这个接口,因为实现这个接口时,支持自己直接和另一个对象比较大小。
3、实现public int compareTo(Object o)方法,当实现类使用了泛型时,Object也可以换成具体的类型
1 public class Student implements Comparable<Student> { 2 3 private String name; 4 private int age; 5 6 public String getName() { 7 return name; 8 } 9 10 public void setName(String name) { 11 this.name = name; 12 } 13 14 public int getAge() { 15 return age; 16 } 17 18 public void setAge(int age) { 19 this.age = age; 20 } 21 22 @Override 23 public int compareTo(Student student) { 24 //在这里我们把age作为对象比较大小的依据 25 if (this.age > student.getAge()) 26 return 1; 27 else if (this.age<student.getAge()) 28 return -1; 29 return 0;//如果两个对象相等,返回0 30 } 31 }
相同点
两者实现的函数的返回值一样,都是int类型的。当要对对象按照某个属性进行比较大小排序时,返回值不同,会影响排序的顺序。例如,如果按照年龄的大小对Student进行排序时,如果按照从小到大的顺序进行排序时,compareTo的实现方法如下:
1、比较者大于被比较者(也就是compareTo方法里面的对象),那么返回正整数
2、比较者等于被比较者,那么返回0
3、比较者小于被比较者,那么返回负整数
如果按照从大到小的顺序进行排序时,只需把1和3中的返回值互换。
实现排序的主函数如下所示:
1 import java.util.ArrayList; 2 import java.util.Arrays; 3 import java.util.List; 4 5 public class Main { 6 public static void main(String[] args) { 7 Student s1 = new Student(); 8 s1.setName("张三"); 9 s1.setAge(18); 10 11 Student s2 = new Student(); 12 s2.setName("李四"); 13 s2.setAge(19); 14 15 Student s3 = new Student(); 16 s3.setName("王五"); 17 s3.setAge(22); 18 19 List<Student> list = new ArrayList<Student>(); 20 list.add(s2); 21 list.add(s3); 22 list.add(s1); 24 、 25 Student[] students1 = new Student[list.size()];//数组的大小需要和集合的长度保持一致,如果数组过长,后面会被自动赋值null,排序时报空指针异常 26 list.toArray(students1);//集合转换成数组 27 28 list.sort(new StudentComparator());//集合排序 29 Arrays.sort(students1);//数组排序 30 31 for (Student student : list) { 32 System.out.println(student.getName()); 33 } 34 } 35 }