Как определяется возвращаемое значение метода compareTo в Java?

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

Ответ

Метод compareTo(T o) интерфейса Comparable<T> возвращает целое число, определяющее естественный порядок сортировки объектов.

Правила возврата значения

  • Отрицательное число (чаще -1): Текущий объект (this) меньше объекта o.
  • Ноль (0): Объекты равны в смысле порядка.
  • Положительное число (чаще 1): Текущий объект (this) больше объекта o.

Примеры и логика

1. Стандартные классы (String, Integer):

String a = "apple";
String b = "banana";
System.out.println(a.compareTo(b)); // -1 ("a" < "b" лексикографически)
System.out.println(b.compareTo(a)); // 1  ("b" > "a")

Integer x = 5;
Integer y = 10;
System.out.println(x.compareTo(y)); // -1 (5 < 10)
System.out.println(y.compareTo(x)); // 1  (10 > 5)

2. Пользовательский класс:

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

    // Сортировка по возрасту (первичный ключ), затем по имени (вторичный)
    @Override
    public int compareTo(Person other) {
        // Сравниваем возраст
        int ageCompare = Integer.compare(this.age, other.age);
        if (ageCompare != 0) {
            return ageCompare; // Возвращаем результат сравнения возрастов
        }
        // Если возрасты равны, сравниваем имена
        return this.name.compareTo(other.name);
    }
}

3. Важная альтернатива (Java 8+): Использование Comparator.comparing() для лаконичности:

Comparator<Person> comparator = Comparator
        .comparingInt(Person::getAge)
        .thenComparing(Person::getName);
// Не требует реализации Comparable в классе Person

Ключевой контракт: Метод должен быть согласован с equals() (хотя это не строгое требование компилятора). Если compareTo() возвращает 0, ожидается, что equals() вернет true. Нарушение этого правила может привести к некорректной работе в коллекциях, основанных на порядке (например, TreeSet).