淺談Comparable和Comparator
Comparable和Comparator是Java對集合對象、數(shù)組對象的排序的兩種方式
Comparable
位于java.lang包下;是一個排序接口,自然排序,實現(xiàn)該接口的類,自動擁有排序的功能;該類的對象可以使用Collections.sort()和Arrays.sort()進行排序;
SortedMap 的key默認使用compareTo方法來進行鍵排序,SortedSet 默認使用compareTo方法進行元素的比較,也就說實現(xiàn)該接口的類對象,可以作為SortedMap的key和作為SortedSet的元素。
源碼解析
public interface Comparable<T> {
public int compareTo(T o);
}
a.compareTo(b):返回正數(shù),說明a比b大
a.compareTo(b):返回負數(shù),說明a比b小
a.compareTo(b):返回0,說明a和b相等
Comparator
位于java.util包下;是一個外部比較器接口,自定義排序,該類的對象可以作為Collections.sort()和Arrays.sort()方法的參數(shù)進行自定義排序。
對于SortedMap和SortedSet來說,一般要保證compare方法和equals方法的結(jié)果保持一致。
對于序列化數(shù)據(jù)結(jié)構(gòu)的TreeMap和TreeSet來說,實現(xiàn)該接口的類也要實現(xiàn)Serializable接口保證序列化的能力。
源碼解析
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
// ...
}
compare(a, b):返回正數(shù),說明a比b大
compare(a, b):返回負數(shù),說明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)