Как сравнивать объекты Integer в Java? Есть ли у Integer встроенный Comparator?

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

Ответ

Нет, класс Integer не содержит встроенного экземпляра Comparator как поле. Однако, для сравнения Integer и других Comparable объектов в Java используются статические фабричные методы класса Comparator.

Стандартные компараторы из java.util.Comparator:

// Естественный порядок (сортировка по возрастанию)
Comparator<Integer> naturalOrder = Comparator.naturalOrder();
List<Integer> list = Arrays.asList(3, 1, 2);
list.sort(naturalOrder); // [1, 2, 3]

// Обратный естественному порядку (по убыванию)
Comparator<Integer> reverseOrder = Comparator.reverseOrder();
list.sort(reverseOrder); // [3, 2, 1]

Создание кастомного Comparator (лямбда или методовая ссылка):

// Сортировка по четности (четные числа сначала)
Comparator<Integer> byEven = (a, b) -> {
    boolean aEven = a % 2 == 0;
    boolean bEven = b % 2 == 0;
    if (aEven == bEven) return 0;
    return aEven ? -1 : 1;
};

// Сортировка по абсолютному значению (используя метод Math.abs)
Comparator<Integer> byAbs = Comparator.comparingInt(Math::abs);

Почему Comparator — это отдельный объект: Это следует принципу единой ответственности. Класс Integer отвечает за хранение целочисленного значения и базовые операции (compareTo). Comparator — это стратегия сравнения, которую можно динамически подставлять в методы сортировки (Collections.sort, List.sort, Stream.sorted), обеспечивая гибкость.