浅谈Comparable和Comparator
Comparable和Comparator是Java对集合对象、数组对象的排序的两种方式
Comparable
位于java.lang
包下;是一个排序接口,自然排序
,实现该接口的类,自动拥有排序的功能;该类的对象可以使用Collections.sort()和Arrays.sort()进行排序;
SortedMap 的key默认使用compareTo方法来进行键排序,SortedSet 默认使用compareTo方法进行元素的比较,也就说实现该接口的类对象,可以作为SortedMap的key和作为SortedSet的元素。
源码解析
public interface Comparable<T> {
public int compareTo(T o);
}
a.compareTo(b)
:返回正数,说明a比b大
a.compareTo(b)
:返回负数,说明a比b小
a.compareTo(b)
:返回0,说明a和b相等
Comparator
位于java.util
包下;是一个外部比较器接口,自定义排序
,该类的对象可以作为Collections.sort()和Arrays.sort()方法的参数进行自定义排序。
对于SortedMap和SortedSet来说,一般要保证compare方法和equals方法的结果保持一致。
对于序列化数据结构的TreeMap和TreeSet来说,实现该接口的类也要实现Serializable接口保证序列化的能力。
源码解析
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
// ...
}
compare(a, b)
:返回正数,说明a比b大
compare(a, b)
:返回负数,说明a比b小
compare(a, b)
:返回0,说明a和b相等
代码
Comparable
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Student implements Serializable, Comparable<Student> {
private String name;
private Integer age;
@Override
public int compareTo(Student s) {
if (age > s.getAge()) {
return 1;
} else if (age < s.getAge()) {
return -1;
} else {
return 0;
}
}
}
@Test
public void test01() {
List<Student> students = Arrays.asList(
new Student("zhangsan", 15),
new Student("lisis", 92),
new Student("wangwu ", 19),
new Student("zhaoliu", 18)
);
Collections.sort(students);
students.stream().forEach(System.out::println);
}
输出:
Student(name=zhangsan, age=15)
Student(name=lisis, age=18)
Student(name=wangwu , age=19)
Student(name=zhaoliu, age=92)
Comparator
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Teacher implements Serializable {
private String name;
private Integer age;
}
@Test
public void test02() {
List<Teacher> teachers = Arrays.asList(
new Teacher("zhangsan", 15),
new Teacher("lisis", 92),
new Teacher("wangwu ", 19),
new Teacher("zhaoliu", 18)
);
Collections.sort(teachers, (a, b) -> {
if (a.getAge() > b.getAge()) {
return 1;
} else if (a.getAge() < b.getAge()) {
return -1;
} else {
return 0;
}
});
teachers.stream().forEach(System.out::println);
}
输出:
Teacher(name=zhangsan, age=15)
Teacher(name=lisis, age=18)
Teacher(name=wangwu , age=19)
Teacher(name=zhaoliu, age=92)