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