前言:
comparator和comparable都是用来实现集合中元素的排序比较的。Comparator位于包下,而Comparable位于包下。他们之间的区别在于用法上。Comparator 是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。Comparable 是一个对象本身就已经支持自比较所需要实现的接口(如 String、Integer 自己就可以完成比较大小操作,已经实现了Comparable接口),对自己写的类实现这一接口来实现按自己规则排序。总结起来就是comparator在外。comparable在内,都是按程序猿自己想法实现排序
一、Comparable可以认为是一个内比较器,实现了Comparable接口的类有一个特点,就是这些类是可以和自己比较的,至于具体和另一个实现了Comparable接口的类如何比较,则依赖compareTo方法的实现
代码:
package com.awakeyo;
/**
* @author awakeyoyoyo
* @className Person
* @description TODO
* @date 2020-01-15 16:25
*/
public class Person implements Comparable<Person>{
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Person o) {
return this.age-o.age;
}
}
调用代码
List<Person> list = new ArrayList<>(100);
Person person;
for (int i=0; i<75; i++) {
person = new Person("person " + i, i);
list.add(person);
}
Collections.shuffle(list);
Collections.sort(list);
list.stream().forEach(e->System.out.println(e.toString()));
二、Comparator可以认为是是一个外比较器,个人认为有两种情况可以使用实现Comparator接口的方式:
1、一个对象不支持自己和自己比较(没有实现Comparable接口),但是又想对两个对象进行比较
2、一个对象实现了Comparable接口,但是开发者认为compareTo方法中的比较方式并不是自己想要的那种比较方式
实现代码:
Collections.sort(list, new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o2.getAge()-o1.getAge();
}
});
list.stream().forEach(e->System.out.println(e.toString()));
最后总结一下两者的不同点:
comparator | comparable | |
---|---|---|
排序代码实现 | 在调用时实现 | 在需排序对象类中实现被称为自然排序 |
实现 | 实现comparator接口的compare方法 | 实现comparator接口的compareTo方法 |
所在包 | ||
触发排序 | (list,new Comparator(){…}) | (list) |