关于Comparator和Comparable的理解

    我们都知道,实现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 }

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2018-07-07 22:13  卡洛小豆  阅读(246)  评论(0编辑  收藏  举报