Ответ
Comparable и Comparator — это интерфейсы для сравнения объектов, но с разными целями и местом применения.
Comparable
- Реализуется самим классом объектов, которые нужно сравнивать.
- Определяет естественный (нативный) порядок сортировки для объектов этого класса.
- Содержит единственный метод
int compareTo(T o).
class Person implements Comparable<Person> {
private String name;
private int age;
@Override
public int compareTo(Person other) {
// Естественная сортировка по имени
return this.name.compareTo(other.name);
}
}
// Использование:
Collections.sort(peopleList); // Сортировка по имени
Comparator
- Реализуется отдельным классом (или лямбдой).
- Определяет альтернативные (внешние) стратегии сортировки, не изменяя исходный класс.
- Содержит метод
int compare(T o1, T o2).
// Компаратор для сортировки по возрасту
Comparator<Person> ageComparator = new Comparator<Person>() {
@Override
public int compare(Person p1, Person p2) {
return Integer.compare(p1.getAge(), p2.getAge());
}
};
// Или с использованием лямбды:
Comparator<Person> ageComparatorLambda = (p1, p2) -> Integer.compare(p1.getAge(), p2.getAge());
// Использование:
Collections.sort(peopleList, ageComparator); // Сортировка по возрасту
peopleList.sort(Comparator.comparingInt(Person::getAge)); // С использованием Comparator.comparing
Ключевое отличие: Comparable отвечает на вопрос "Как сравнивать объекты этого класса по умолчанию?", а Comparator — *"Как сравнить эти объекты по другому, специфическому правилу?".Comparable— это внутренний порядок,Comparator` — внешний и гибкий.