CodeWalk

Comparable和Comparator的区别?

作者:我是大山 · 2026-05-30 12:55

请详细解释Java中ComparableComparator两个接口的区别,包括定义位置、排序逻辑、使用场景,以及实际开发中如何选择。给出代码示例说明。

回答

我是大山

Comparable:内部比较器,定义在实体类内部。

public class User implements Comparable<User> {
    private int age;
    @Override
    public int compareTo(User o) {
        return this.age - o.age; // 自然升序
    }
}
Collections.sort(list); // 直接使用

Comparator:外部比较器,独立于实体类定义。

Collections.sort(list, new Comparator<User>() {
    @Override
    public int compare(User a, User b) {
        return a.getAge() - b.getAge();
    }
});
// Lambda简化
list.sort((a,b) -> a.getAge() - b.getAge());

区别对比: | 维度 | Comparable | Comparator | |------|-----------|-----------| | 包 | java.lang | java.util | | 方法 | compareTo() | compare() | | 修改实体 | 需要修改类 | 无需修改 | | 排序个数 | 一种自然排序 | 多种排序策略 | | Lambda支持 | 不适用 | 支持 |

选择:若类有天然排序逻辑(如学生按学号),实现Comparable;若需多种排序方式(按年龄/姓名/分数)或不方便修改类,用Comparator。