Ответ
Возврат значения 0 из метода Comparator.compare(T o1, T o2) означает, что с точки зрения данного компаратора объекты o1 и o2 равны (эквивалентны) в контексте устанавливаемого порядка.
Последствия:
- При сортировке (например,
Collections.sort()) порядок двух объектов, для которыхcompare()вернул 0, относительно друг друга считается неопределённым (может сохраниться исходный). - В структурах данных, основанных на упорядочении (
TreeSet,TreeMap), объекты сcompare() == 0рассматриваются как равные, даже если их методequals()возвращаетfalse. Это может привести к неожиданному "исчезновению" элементов.
Пример:
// Компаратор, сравнивающий строки только по их длине
Comparator<String> lengthComparator = (s1, s2) -> s1.length() - s2.length();
int result = lengthComparator.compare("cat", "dog"); // result = 0 (длины равны)
// Для этого компаратора строки "cat" и "dog" эквивалентны.
Важные правила и best practices:
- Согласованность с
equals(): Желательно, чтобы выполнение условияcompare(x, y) == 0было эквивалентноx.equals(y). Если это не так, это должно быть явно задокументировано. - Работа с
null: Стандартные компараторы не принимаютnull. Для безопасного сравнения используйтеComparator.nullsFirst(comparator)илиComparator.nullsLast(comparator). - Симметричность: Контракт требует, чтобы знак результата
compare(x, y)был противоположен знакуcompare(y, x).