Интерфейс
Comparable определяет
естественный порядок среди объектов.
Java Collections Framework активно использует этот порядок. По нему упорядочены элементы
SortedSet/
SortedMap, им упорядочиваются элементы списков и массивов в методе sort().
Порядок определяется единственным методом
compareTo. Отрицательный результат означает что текущий объект «меньше» чем переданный параметром,
0 – равен, положительный – больше. Рекомендуется чтобы равные с точки зрения equals объекты всегда были равны с точки зрения
compareTo.
С математической точки зрения это должен быть
линейный порядок. Он требует выполнения четырех свойств:
1. Антирефлексивность:
x.compareTo(x) всегда
0;
2. Антисимметричность: если
x.compareTo(y) > 0, то
y.compareTo(x) < 0;
3. Транзитивность: если
x.compareTo(y) > 0 и
y.compareTo(z) > 0, то
x.compareTo(z) > 0;
4. Полнота: отношение определено для любых объектов класса (кроме
null).
Интерфейс
Comparator – это логика
Comparable, вынесенная в отдельный объект. Компаратор реализует
паттерн Стратегия. Большинство платформенных методов, использующих
Comparable имеют перегруженный вариант с не-comparable объектом и внешним компаратором.
Comparator бывает полезен, когда класс предоставлен сторонней библиотекой, и нет возможности его менять. Другой случай – особая логика упорядочивания, не свойственная классу объектов в общем, но нужная для отдельной ситуации.
Кроме основного метода
compare(), в компараторе есть набор утилитарных методов для комбинирования и модификации компараторов. Все они возвращают новый компаратор, позволяя сделать его
иммутабельным.