Java Comparator 与 Comparable 比较器

Java Comparator 与 Comparable 比较器

在 Java 中,ComparatorComparable 都是用来进行对象比较的接口,但它们的使用方式和目的略有不同。下面是它们的详细对比:


一、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