1、Comparable内比较器
Comparable是一个内比较器,实现了Comparable接口的类有一个特点,就是这些类是可以和自己比较的,至于具体和另一个实现了Comparable的类如何比较,则依赖compareTo方法的实现,compareTo方法也被称为自然比较方法
compareTo方法的返回值是int,有三种情况:
1、比较者大于被比较者(也就是compareTo方法里面的对象),那么返回正整数
2、比较者等于被比较者,那么返回0
3、比较者小于被比较者,那么返回负整数
public class Student implements Comparable<Student>{
private String name;
private int age;
public Student(String name,int age) {
this.name=name;
this.age=age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public int compareTo(Student o) {
if (this.age<o.age) {
return -1;
}else if (this.age>o.age) {
return 1;
}else {
return this.name.compareTo(o.name);
}
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
}
注意:前面说实现Comparable接口的类是可以支持和自己比较的,但是其实代码里面Comparable的泛型未必就一定要是Domain,将泛型指定为String或者指定为其他任何任何类型都可以—-只要开发者指定了具体的比较算法就行。
2Comparator外比较器
Comparator可以认为是是一个外比较器,个人认为有两种情况可以使用实现Comparator接口的方式:
1、一个对象不支持自己和自己比较(没有实现Comparable接口),但是又想对两个对象进行比较
2、一个对象实现了Comparable接口,但是开发者认为compareTo方法中的比较方式并不是自己想要的那种比较方式
Comparator接口里面有一个compare方法,方法有两个参数T o1和T o2,是泛型的表示方式,分别表示待比较的两个对象,方法返回值和Comparable接口一样是int,有三种情况:
1、o1大于o2,返回正整数
2、o1等于o2,返回0
3、o1小于o3,返回负整数
package com.sk;
import java.util.Comparator;
public class StudentComparator implements Comparator<Student>{
@Override
public int compare(Student o1, Student o2) {
if (o1.getAge()>o2.getAge()) {
return -1;
}else if (o1.getAge()<o2.getAge()) {
return 1;
}else {
return o1.getName().compareTo(o2.getName())*-1;
}
}
public static void main(String [] args) {
Student s1=new Student("A", 12);
Student s2=new Student("B", 12);
Student s3=new Student("C", 22);
StudentComparator sc=new StudentComparator();
System.out.println(sc.compare(s1, s2));
System.out.println(sc.compare(s1, s3));
}
}
3、总结
- Comparable & Comparator 都是用来实现集合中元素的比较、排序的,只是 Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法
- Comparator位于包java.util下,而Comparable位于包 java.lang下
- Comparable 是一个对象本身就已经支持自比较所需要实现的接口(如 String、Integer 自己就可以完成比较大小操作,已经实现了Comparable接口)
自定义的类要在加入list容器中后能够排序,可以实现Comparable接口,在用Collections类的sort方法排序时,如果不指定Comparator,那么就以自然顺序排序。 - 而 Comparator 是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。
可以说一个是自已完成比较,一个是外部程序实现比较的差别而已。
用 Comparator 是策略模式(strategy design pattern),就是不改变对象自身,而用一个策略对象(strategy object)来改变它的行为。