Что такое интерфейс Comparator в Java и для чего он нужен?

«Что такое интерфейс Comparator в Java и для чего он нужен?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Интерфейс Comparator<T> используется для определения альтернативных (произвольных) правил сортировки объектов, отличных от их естественного порядка, или для сортировки объектов классов, не реализующих Comparable.

Для чего нужен:

  • Сортировка объектов по разным критериям (например, сортировка Person по имени, зарплате, дате найма).
  • Сортировка объектов классов, которые вы не можете изменить (например, классов из сторонних библиотек).
  • Определение порядка, противоположного естественному.

Пример реализации:

// Компаратор для сортировки Person по имени
public class NameComparator implements Comparator<Person> {
    @Override
    public int compare(Person p1, Person p2) {
        return p1.getName().compareTo(p2.getName());
    }
}

// Компаратор для сортировки по убыванию возраста (лямбда)
Comparator<Person> byAgeDesc = (p1, p2) -> Integer.compare(p2.getAge(), p1.getAge());

// Использование:
List<Person> people = new ArrayList<>();
// ... добавление людей

Collections.sort(people, new NameComparator()); // Сортировка по имени
people.sort(byAgeDesc); // Сортировка по убыванию возраста (Java 8+)

Ключевое отличие от Comparable: Comparator — это внешняя, гибкая стратегия сравнения, которую можно создавать в любом количестве вариантов.