С JavaNotes :
a.compareTo(b)
Сопоставимый интерфейс: Сравнивает значения и возвращает целое число, которое сообщает, сравниваются ли значения меньше, равно или больше чем.
Если ваши объекты класса имеют естественный порядок , реализуйте интерфейс Comparable<T>
и определите этот метод. Все классы Java, которые имеют естественное упорядочение, реализуют Comparable<T>
- Пример: String
, классы-оболочки , BigInteger
compare(a, b)
Интерфейс компаратора: Сравнивает значения двух объектов. Это реализовано как часть интерфейса Comparator<T>
, и типичное использование состоит в определении одного или нескольких небольших служебных классов, которые реализуют это, для передачи в методы, такие как sort()
, или для использования путем сортировки структур данных, таких как TreeMap
и TreeSet
. Возможно, вы захотите создать объект Comparator для следующего:
- Множественные сравнения . Предоставить несколько разных способов что-то отсортировать. Например, вы можете отсортировать класс Person по имени, идентификатору, возрасту, росту и т. Д. Для каждого из них вы должны определить компаратор для передачи в метод
sort()
.
- Системный класс Чтобы предоставить методы сравнения для классов, которые вы не можете контролировать. Например, вы можете определить компаратор для строк, который сравнивает их по длине.
- Шаблон стратегии Для реализации шаблона Стратегии, который представляет собой ситуацию, в которой вы хотите представить алгоритм в виде объекта, который вы можете передать в качестве параметра, сохранить в структуре данных и т. Д.
Если ваши объекты класса имеют один естественный порядок сортировки, вам может не понадобиться сравнение ().
Сводка от http://www.digizol.com/2008/07/java-sorting-comparator-vs-comparable.html
Сопоставимые
Сопоставимый объект способен сравнивать себя с другим объектом.
Компаратор
Объект сравнения способен сравнивать два разных объекта. Класс сравнивает не свои экземпляры, а экземпляры некоторых других классов.
Контексты использования:
Сопоставимый интерфейс
Метод равенства и ==
и !=
операторы проверяют на равенство / неравенство, но не предоставляют способ проверки на относительные значения .
Некоторые классы (например, String и другие классы с естественным упорядочением) реализуют интерфейс Comparable<T>
, который определяет метод compareTo()
.
Вы захотите реализовать Comparable<T>
в своем классе, если хотите использовать его с методами Collections.sort()
или Arrays.sort()
.
Определение объекта Comparator
Вы можете создавать компараторы для сортировки любым произвольным образом для любого класса .
Например, класс String
определяет компаратор CASE_INSENSITIVE_ORDER
.
Разница между этими двумя подходами может быть связана с понятием:
Заказная коллекция :
Когда коллекция упорядочена, это означает, что вы можете выполнять итерации в коллекции в определенном (не случайном) порядке (Hashtable
не упорядочено).
Коллекция с естественным порядком не просто заказана, а отсортирована . Определение естественного порядка может быть сложным! (как в порядке натуральных строк ).
Еще одно отличие, отмеченное HaveAGuess в комментариях :
Comparable
находится в реализации и не виден из интерфейса, поэтому, когда вы сортируете, вы действительно не знаете, что произойдет.
Comparator
дает вам уверенность в том, что порядок будет четко определен.