Comparing 2 Flashcards
Можно ли использовать лямбда-выражения для создания Comparator?
Да, начиная с Java 8, лямбда-выражения упрощают создание Comparator. Например:
Comparator<Person> byName = (p1, p2) -> p1.getName()
.compareTo(p2.getName());</Person>
Что такое “цепочка компараторов”?
Цепочка компараторов — это техника, при которой несколько Comparator-ов объединяются для сравнения объектов по нескольким критериям. Если первый компаратор возвращает 0 (равенство), используется следующий, и так далее. Пример:
Comparator<Person> byNameThenAge = Comparator.comparing(Person::getName) .thenComparing(Prson::getAge);</Person>
Что произойдет, если при использовании Comparator передать null в метод compare()?
Передача null в метод compare() приведет к исключению NullPointerException, если не была предусмотрена логика обработки null.
Для обработки можно использовать специальные компараторы, такие как Comparator.nullsFirst() и Comparator.nullsLast():
Comparator<Person> byName = Comparator.nullsFirst
(Comparator.comparing(Person::getName));</Person>
Можно ли реализовать сравнение объектов без использования Comparable или Comparator?
Да, можно реализовать сравнение объектов напрямую через методы класса.
Однако для использования стандартных механизмов сортировки и структур данных, таких как TreeSet или Collections.sort(), рекомендуется использовать Comparable или Comparator.
Что происходит при сравнении объектов с использованием методов equals() и compareTo()?
- equals() проверяет логическое равенство. Объекты могут быть равны по equals(), но это не означает, что они будут иметь одинаковый порядок по compareTo().
- compareTo() используется для упорядочивания и не обязательно зависит от метода equals().
Что должно быть соблюдено при реализации compareTo() и equals()?
Рекомендуется, чтобы объекты, которые равны по equals(), также были равны по compareTo().
Однако это не является обязательным требованием.
Нарушение этого правила может привести к неожиданным результатам при работе с коллекциями, основанными на сортировке (например, TreeSet).
Что такое “стабильная сортировка”?
Стабильная сортировка сохраняет относительный порядок равных объектов. В Java метод Collections.sort() является стабильным, что означает, что объекты, которые равны по compareTo() или Comparator, сохраняют свой исходный порядок в коллекции.
Как влияет изменение состояния объекта на его сравнение?
Если поля объекта, используемые для сравнения, изменяются после того, как объект был помещён в сортированную коллекцию (например, TreeSet или PriorityQueue), это может привести к некорректной работе коллекции. Поэтому такие поля должны оставаться неизменными после добавления объекта в структуру данных.