Для чего используется интерфейс Comparator в Java?

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

Ответ

Comparator используется для определения внешней (кастомной) логики сравнения объектов, отличающейся от их естественного порядка (заданного через Comparable).

Основные сценарии использования:

  1. Сортировка объектов по нестандартным критериям
  2. Создание нескольких различных порядков сортировки для одного класса
  3. Сравнение объектов классов, которые не реализуют Comparable

Пример: Сортировка пользователей по разным полям

class User {
    String name;
    int age;
}

// Компаратор по имени
Comparator<User> byName = Comparator.comparing(u -> u.name);

// Компаратор по возрасту (обратный порядок)
Comparator<User> byAgeDesc = (u1, u2) -> u2.age - u1.age;

// Комбинированный компаратор (сначала по возрасту, потом по имени)
Comparator<User> byAgeThenName = Comparator
    .comparingInt((User u) -> u.age)
    .thenComparing(u -> u.name);

List<User> users = ...;
users.sort(byAgeThenName); // Сортировка с использованием компаратора
Ключевые отличия от Comparable: Comparable Comparator
Определяет естественный порядок Определяет альтернативный порядок
Метод compareTo() внутри класса Метод compare() вне класса
Изменяет исходный класс Не требует изменения исходного класса
Одна логика сравнения на класс Много логик сравнения на класс

Современный стиль (Java 8+): Используйте фабричные методы Comparator.comparing(), thenComparing() для создания цепочек сравнения.