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

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

Ответ

Интерфейс Comparable<T> определяет естественный порядок сортировки объектов класса. Класс, реализующий этот интерфейс, обязуется предоставить реализацию метода compareTo(T o), который сравнивает текущий объект (this) с заданным.

Сигнатура и контракт метода int compareTo(T o):

  • Возвращает отрицательное целое число, если this < o.
  • Возвращает ноль, если this == o.
  • Возвращает положительное целое число, если this > o.

Пример: Сортировка объектов Person по возрасту

class Person implements Comparable<Person> {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public int compareTo(Person other) {
        // Сравниваем по полю age (естественный порядок)
        return Integer.compare(this.age, other.age);
    }

    // Геттеры, toString() и т.д.
}

// Использование
List<Person> people = Arrays.asList(
    new Person("Alice", 30),
    new Person("Bob", 25)
);
Collections.sort(people); // Сортировка по age: Bob (25), Alice (30)

Где применяется? Методы, использующие Comparable:

  • Collections.sort(list) / Arrays.sort(array)
  • Collections.binarySearch(...)
  • Автоматическая сортировка в TreeSet<T> и TreeMap<K, V>.

Важно: Реализация compareTo() должна быть согласована с equals() (т.е., a.compareTo(b) == 0 должен возвращать true тогда же, когда и a.equals(b)). Это критично для корректной работы с коллекциями, основанными на сравнении.