Java Comparator 与 Comparable 比较器
在 Java 中,Comparator 和 Comparable 都是用来进行对象比较的接口,但它们的使用方式和目的略有不同。下面是它们的详细对比:
一、Comparable 接口
-
包名:
java.lang -
定义:对象自身具备比较能力。
-
方法:
int compareTo(T o) -
用途:自然排序(Natural Ordering),也就是对象默认的排序方式。
使用示例:
public class Student implements Comparable<Student> {
private String name;
private int score;
public Student(String name, int score) {
this.name = name;
this.score = score;
}
@Override
public int compareTo(Student other) {
return this.score - other.score; // 按成绩升序
}
}
使用:
List<Student> list = new ArrayList<>();
list.add(new Student("Tom", 85));
list.add(new Student("Jerry", 90));
Collections.sort(list); // 按照 score 排序
二、Comparator 接口
-
包名:
java.util -
定义:创建一个“外部比较器”,不修改类本身。
-
方法:
int compare(T o1, T o2) -
用途:定制排序(Custom Ordering),多个排序方式时特别有用。
使用示例:
public class Student {
private String name;
private int score;
public Student(String name, int score) {
this.name = name;
this.score = score;
}
public int getScore() {
return score;
}
}
// 外部比较器
class ScoreDescendingComparator implements Comparator<Student> {
@Override
public int compare(Student s1, Student s2) {
return s2.getScore() - s1.getScore(); // 按成绩降序
}
}
使用:
List<Student> list = new ArrayList<>();
list.add(new Student("Tom", 85));
list.add(new Student("Jerry", 90));
Collections.sort(list, new ScoreDescendingComparator());
三、对比总结
| 特点 | Comparable | Comparator |
|---|---|---|
| 所在包 | java.lang |
java.util |
| 接口方法 | compareTo(T o) |
compare(T o1, T o2) |
| 是否修改类代码 | 是(实现接口) | 否(独立实现) |
| 排序逻辑位置 | 类的内部 | 类的外部 |
| 使用场景 | 固定的、默认的排序逻辑 | 灵活的、多种排序方式 |
如果你想让一个类默认具备排序功能,用 Comparable;
如果你需要不同的排序方式,或者不能修改类源码,用 Comparator。