Comparable
//源码
public interface Comparable<T> {
public int compareTo(T o);
}
- Comparable位于包java.lang下
- Comparable是排序接口,
实现该接口的的类支持排序
,接口中通过x.compareTo(y)
比较大小。若返回负数,意味着x比y小;返回零,意味着x等于y;返回正数,意味着x大于y。 - Comparable是在集合内部实现方法来实现的排序,相当于
内部比较器
- 一些支持排序的类(String、Integer等)都实现了该接口
自定义的类通过实现Comparable接口
,通过Collections.sort(list)或者Arrays.sort(arr)实现排序
。这里调用sort并没有指定Comparator,就是自然排序
Comparator
//源码
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
//默认的倒序方法,可直接通过Comparator实例直接调用
default Comparator<T> reversed() {
return Collections.reverseOrder(this);
}
//其他实现的默认方法
......
}
- Comparator位于java.util包下
- Comparator 是一个专用的比较器,当这个
对象不支持自比较或者自比较函数不能满足你的要求时(即没有实现Comparable接口,或者实现的compareTo()方式不满足需求)
,可以用比较器来完成两个对象之间大小的比较。 - Comparator 接口中通过
int compare(T x, T y)
比较大小。若返回负数,意味着x比y小;返回零,意味着x等于y;返回正数,意味着x大于y。 - Comparator体现了一种策略模式(strategy design pattern),就是不改变对象自身,而用一个策略对象(strategy object)来改变它的行为
- Comparator相当于
外部比较器
- 源码中可知
Comparator接口中有两个未实现方法 compare和equals
,实践中,在实现Comparator接口时,并没有实现equals方法,可程序并没有报错,原因是实现该接口的类也是Object类的子类,而Object类已经实现了equals方法
简单的实现
class Student implements Comparable<Student>{
public int grade;
public Student(int grade){
this.grade=grade;
}
@Override
public int compareTo(Student o) {
if(grade>o.grade){
return -1;
}else if(grade<o.grade){
return 1;
}
return 0;
}
}
public class Test {
public static void main(String[] args){
List<Student> list=new ArrayList<>();
list.add(new Student(70));
list.add(new Student(60));
list.add(new Student(90));
System.out.println("-----未排序-----");
for(Student student:list){
System.out.print(student.grade+" ");
}
System.out.println("\n-----Comparable降序排序-----");
//自然排序
Collections.sort(list);
for(Student student:list){
System.out.print(student.grade+" ");
}
System.out.println("\n-----Comparator升序排序-----");
//这里是通过匿名类实现的Comparator接口
//也可以定义一个实现接口的类,这里就不赘述了
//当然也可以使用lambda,Collections.sort(list, (o1, o2) -> o2.grade - o1.grade);
//关于lambda也不甚了解,后期再补吧~~~
//这里也可以看出,在有外部比较器时,sort是优先使用外部比较器的
Collections.sort(list, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
if(o1.grade<o2.grade)
return -1;
else if (o1.grade>o2.grade)
return 1;
return 0;
}
});
for(Student student:list){
System.out.print(student.grade+" ");
}
}
}
结果:
-----未排序-----
70 60 90
-----Comparable降序排序-----
90 70 60
-----Comparator升序排序-----
60 70 90
参考
https://blog.csdn.net/mageshuai/article/details/3849143
https://blog.csdn.net/u010859650/article/details/85009595