淺談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)