В чем разница между Comparator и Comparable в Java?

«В чем разница между Comparator и Comparable в Java?» — вопрос из категории Java, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Comparable и Comparator — это интерфейсы для сравнения объектов, но с разными целями и местом применения.

Comparable

  • Реализуется самим классом объектов, которые нужно сравнивать.
  • Определяет естественный (нативный) порядок сортировки для объектов этого класса.
  • Содержит единственный метод int compareTo(T o).
class Person implements Comparable<Person> {
    private String name;
    private int age;

    @Override
    public int compareTo(Person other) {
        // Естественная сортировка по имени
        return this.name.compareTo(other.name);
    }
}
// Использование:
Collections.sort(peopleList); // Сортировка по имени

Comparator

  • Реализуется отдельным классом (или лямбдой).
  • Определяет альтернативные (внешние) стратегии сортировки, не изменяя исходный класс.
  • Содержит метод int compare(T o1, T o2).
// Компаратор для сортировки по возрасту
Comparator<Person> ageComparator = new Comparator<Person>() {
    @Override
    public int compare(Person p1, Person p2) {
        return Integer.compare(p1.getAge(), p2.getAge());
    }
};
// Или с использованием лямбды:
Comparator<Person> ageComparatorLambda = (p1, p2) -> Integer.compare(p1.getAge(), p2.getAge());

// Использование:
Collections.sort(peopleList, ageComparator); // Сортировка по возрасту
peopleList.sort(Comparator.comparingInt(Person::getAge)); // С использованием Comparator.comparing

Ключевое отличие: Comparable отвечает на вопрос "Как сравнивать объекты этого класса по умолчанию?", а Comparator — *"Как сравнить эти объекты по другому, специфическому правилу?".Comparable— это внутренний порядок,Comparator` — внешний и гибкий.