简介
在Java中,Comparable与Comparator两个接口都是用来做比较的。
Java环境:JDK1.8
Comparable
Comparable接口就是用于给类提供默认比较功能的。
Comparable可以认为是一个内比较器,很多类都会实现这个接口以提供对该类对象之间比较的默认实现;例如String,Integer等类都实现了Comparable接口。这些类提供了自己对象之间比较大小的默认实现,如果我们想一个对象自己有比较行为的话,就需要该类实现Comparable接口。
public class Test3 {
public static void main(String[] args) throws Exception {
Person person1 = new Person("张三", 20);
Person person2 = new Person("李四", 30);
Person person3 = new Person("王五", 10);
List<Person> personList = Arrays.asList(person1, person2, person3);
System.out.println("排序前=====================");
personList.forEach(System.out::println);
System.out.println("排序后=====================");
Collections.sort(personList);
personList.forEach(System.out::println);
}
static class Person implements Comparable<Person>{
private String name;
private Integer age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
//Person按照年龄排序
@Override
public int compareTo(Person o) {
return this.getAge().compareTo(o.getAge());
}
}
}
运行结果:
排序前=====================
Person{name='张三', age=20}
Person{name='李四', age=30}
Person{name='王五', age=10}
排序后=====================
Person{name='王五', age=10}
Person{name='张三', age=20}
Person{name='李四', age=30}
compareTo方法的返回值是int,有三种情况(比较者=调用compareTo方法者;被比较者=也就是compareTo方法接受对象):
1、比较者大于被比较者,那么返回 1
2、比较者等于被比较者,那么返回 0
3、比较者小于被比较者,那么返回 -1
Comparator
Comparator可以认为是是一个外比较器,认为有两种情况可以使用实现Comparator接口的方式
(1)向集合中添加数据的时候,需要这个对象本身具备比较的行为(有源码的情况)
(2)一个对象实现了Comparable接口,但是开发者认为compareTo方法中的比较方式并不是自己想要的那种比较方式。如:修改String的默认排序;再就是不能修改源码的情况
public class Test3 {
public static void main(String[] args) throws Exception {
//Person按照年龄排序
Person person1 = new Person("张三", 20);
Person person2 = new Person("李四", 30);
Person person3 = new Person("王五", 10);
List<Person> personList = Arrays.asList(person1, person2, person3);
System.out.println("排序前=====================");
personList.forEach(System.out::println);
System.out.println("排序后=====================");
// Collections.sort(personList, (o1, o2) -> {
// //自定义规则
// return o1.getAge().compareTo(o2.getAge());
// });
//简写方式
personList.sort(Comparator.comparing(Person::getAge));
// 多个字段的排序
// personList.sort(Comparator.comparing(Person::getAge)
// .thenComparing(Person::name);
personList.forEach(System.out::println);
}
static class Person{
private String name;
private Integer age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
}
运行结果:
排序前=====================
Person{name='张三', age=20}
Person{name='李四', age=30}
Person{name='王五', age=10}
排序后=====================
Person{name='王五', age=10}
Person{name='张三', age=20}
Person{name='李四', age=30}