Сотовая сторона: в чем разница между Comparable и Comparator?

Java задняя часть
Сотовая сторона: в чем разница между Comparable и Comparator?

"Это 4-й день моего участия в ноябрьском испытании обновлений, ознакомьтесь с подробностями события:Вызов последнего обновления 2021 г."

В тот день Сяо Эр отправился в Мафэнво на собеседование, и интервьюер Лао Ван сразу же задал ему вопрос: в чем разница между Comparable и Comparator? Сяо Эр чуть не рассмеялся, потому что три года назад, в 2021 году, он увидел этот вопрос в рубрике «Дорога к продвинутым Java-программистам» 😆.

PS: Чтобы помочь большему количеству новичков в Java, «Дорога к продвинутым программистам Java» была открыта для GitHub (эта статья была включена). На данный момент колонка получила 580 звезд. Если вам нравится эта колонка и вы считаете ее полезной, вы можете щелкнуть звезду, что также будет способствовать более систематическому обучению в будущем!

Адрес гитхаба:GitHub.com/IT Ван Эр/до…

Адрес облака кода:Silent King II/toBeBetterJavaer

Comparable и Comparator — это два интерфейса в Java, и мы можем прочитать их сходство из названия: чтобы каким-то образом сравнить два объекта. Но в чем именно разница между ними? Пожалуйста, пойдем со мной, сразись с монстрами, чтобы продвинуться вперед!

01. Сопоставимо

Определение интерфейса Comparable очень простое, исходный код выглядит следующим образом.

public interface Comparable<T> {
    int compareTo(T t);
}

Если класс реализует интерфейс Comparable (просто сделайте одну вещь, переопределитеcompareTo()метод), вы можете сравнивать созданные им объекты по своим правилам. Пример приведен ниже.

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

    public Cmower(int age, String name) {
        this.age = age;
        this.name = name;
    }

    @Override
    public int compareTo(Cmower o) {
        return this.getAge() - o.getAge();
    }

    public static void main(String[] args) {
        Cmower wanger = new Cmower(19,"沉默王二");
        Cmower wangsan = new Cmower(16,"沉默王三");

        if (wanger.compareTo(wangsan) < 0) {
            System.out.println(wanger.getName() + "比较年轻有为");
        } else {
            System.out.println(wangsan.getName() + "比较年轻有为");
        }
    }
}

В приведенном выше примере я создал класс Cmower с двумя полями: возраст и имя. Класс Cmower реализует интерфейс Comparable и переопределяетcompareTo()метод.

Результат вывода программы: «Молчаливый Ван Сан моложе и перспективнее», потому что он на три года моложе Молчаливого Ван Эра. Есть ли доказательства этого результата?

ДоказательствоcompareTo()метод, возвращаемое значение этого метода может быть отрицательным, нулевым или положительным, что означает, что объект меньше, равен или больше сравниваемого объекта в соответствии с правилами сортировки. Возникает, если тип указанного объекта не сопоставим с этим объектомClassCastExceptionИсключение (это редко случалось со времен дженериков).

02. Компаратор

Определение интерфейса Comparator намного сложнее, чем у Comparable, однако основных методов всего два. Давайте посмотрим на исходный код.

public interface Comparator<T> {
    int compare(T o1, T o2);
    boolean equals(Object obj);
}

первый методcompare(T o1, T o2)Возвращаемое значение может быть отрицательным, нулевым или положительным, что означает, что первый объект меньше, равен или больше второго объекта.

второй методequals(Object obj)Вам нужно передать объект в качестве параметра и определить, совместим ли объект с компаратором.

Иногда мы хотим оставить класс как есть и не хотим активно реализовывать интерфейс Comparable, но нам нужно их сравнить, что нам делать?

Вот где Comparator пригодится, давайте рассмотрим пример.

1) Класс Cmower как он есть.

public class Cmower  {
    private int age;
    private String name;

    public Cmower(int age, String name) {
        this.age = age;
        this.name = name;
    }
}

(Говорят, что он цел, геттер/сеттер съеден)

Класс Cmower имеет два поля: возраст и имя, а это значит, что класс можно сортировать по возрасту или имени.

2) Давайте посмотрим на класс реализации интерфейса Comparator.

public class CmowerComparator implements Comparator<Cmower> {
    @Override
    public int compare(Cmower o1, Cmower o2) {
        return o1.getAge() - o2.getAge();
    }
}

Сравните по возрасту. Конечно, вы также можете реализовать компаратор для выполнения естественной сортировки по имени Пример выглядит следующим образом.

public class CmowerNameComparator implements Comparator<Cmower> {
    @Override
    public int compare(Cmower o1, Cmower o2) {
        if (o1.getName().hashCode() < o2.getName().hashCode()) {
            return -1;
        } else if (o1.getName().hashCode() == o2.getName().hashCode()) {
            return 0;
        }
        return 1;
    }
}

3) Давайте снова посмотрим на тестовый класс.

Cmower wanger = new Cmower(19,"沉默王二");
Cmower wangsan = new Cmower(16,"沉默王三");
Cmower wangyi = new Cmower(28,"沉默王一");

List<Cmower> list = new ArrayList<>();
list.add(wanger);
list.add(wangsan);
list.add(wangyi);

list.sort(new CmowerComparator());

for (Cmower c : list) {
    System.out.println(c.getName());
}

Создал три объекта разного возраста и с разными именами и добавил их в Список. Затем используйте Списокsort()метод для сортировки и просмотра результатов вывода.

沉默王三
沉默王二
沉默王一

Это означает, что Молчаливый Ван Сан моложе Молчаливого Ван Эра и занимает первое место, Молчаливый Ван И старше, чем Молчаливый Ван Эр и занимает третье место. Точно в соответствии с нашими ожиданиями.

03. Какой из них я должен использовать?

Разницу между Comparable и Comparator можно сравнить с помощью двух приведенных выше примеров:

  • Класс реализует интерфейс Comparable, что означает, что объекты этого класса можно сравнивать (сортировать) напрямую, но есть только один способ сравнения (сортировки), причем очень единственный.
  • Если класс хочет остаться таким, какой он есть, но его нужно сравнивать (сортировать) по-другому, он может настроить компаратор (реализовать интерфейс Comparator).
  • Сопоставимый интерфейс вjava.langпакет, покаComparatorинтерфейс вjava.utilБао Ся не настоящий брат, но его можно назвать двоюродным братом (двоюродным братом).

Возьмем неуместный пример. Я хочу отправиться из Лояна в Пекин, чтобы увидеть Великую китайскую стену и почувствовать себя героем, будь то на самолете или на скоростном поезде, но если это будет Король обезьян, это будет сальто. В чем разница между мной и Сунь Укуном? Сунь Укун сам реализовал интерфейс Comparable (в его время не было ни самолета, ни высокоскоростной железной дороги, поэтому у него не было выбора), а я могу использовать интерфейс Comparator (современный транспорт).


Что ж, давайте сначала поговорим о Comparable и Comparator. Таким образом, если сортировка объектов должна основываться на естественном порядке, выберитеComparableЕсли нужно отсортировать по разным атрибутам объекта, выберитеComparator.

Это 67-я статья рубрики «Путь к продвинутому Java-программисту». Продвинутый путь Java-программистов, эта колонка юмористическая, простая для понимания, чрезвычайно дружелюбная и удобная для начинающих Java😘, включая, помимо прочего, синтаксис Java, структуру сбора Java, Java IO, параллельное программирование Java, виртуальную машину Java и т. д. основные очки знаний.

Адрес гитхаба:GitHub.com/IT Ван Эр/до…

Адрес облака кода:Silent King II/toBeBetterJavaer

Ярко-белые и темные PDF-файлы тоже готовы, давайте вместе станем лучшими Java-инженерами, пойдем вместе!