💡 Инструкция: Выберите один ответ из пяти. На 20 вопросов отведено 55 минут. В каждом вопросе верен только один вариант; близкие ответы различаются стадией ошибки, порядком действий или границей контракта. После завершения вы увидите общий результат, результаты по 4 тематическим шкалам и объяснения.
Вопрос 4 из 20
Какой диагноз для кода по теме «Контракты коллекций» в разделе «equals, hashCode и сравнение объектов» будет точным?
Java Контракты коллекций · фрагмент для анализа Копировать
record Item(int id, int rank) {}
var byRank = java.util.Comparator.comparingInt(Item::rank);
var set = new java.util.TreeSet<>(byRank);
set.add(new Item(1, 10));
set.add(new Item(2, 10));
System.out.println(set.size());
Два равных значения добавляются один раз, поэтому размер HashSet равен 1.
Comparator по rank считает две записи с rank = 10 эквивалентными, поэтому TreeSet оставляет один элемент, несмотря на разные id.
Comparator по rank считает две записи с rank = 11 эквивалентными, поэтому TreeSet оставляет один элемент, несмотря на разные id.
Comparator только по длине считает строки «ab» и «cd» эквивалентными, поэтому TreeSet оставляет один элемент.
Comparator по rank считает две записи с rank = 9 эквивалентными, поэтому TreeSet оставляет один элемент, несмотря на разные id.
Вопрос 14 из 20
Какой диагноз для кода по теме «Равенство» в разделе «equals, hashCode и сравнение объектов» будет точным?
Java Равенство · фрагмент для анализа Копировать
record User(int id, String name) {}
var a = new User(1, "Ann");
var b = new User(1, "Bob");
System.out.println(a.equals(b));
Класс-чтение record сравнивает все компоненты: объекты с одинаковым id, но разным name не равны, поэтому программа печатает false.
Класс-запись record сравнивает все компоненты: объекты с одинаковым id, но разным name не равны, поэтому программа печатает true.
Первое сравнение ложно, второе истинно: объекты разные, содержимое одинаковое.
Класс-запись record сравнивает все компоненты: объекты с одинаковым id, но разным name не равны, поэтому программа печатает false.
Comparator по rank считает две записи с rank = 10 эквивалентными, поэтому TreeSet оставляет один элемент, несмотря на разные id.
Вопрос 15 из 20
Что важно учитывать при применении механизма «Контракты коллекций» из раздела «equals, hashCode и сравнение объектов» в рабочем проекте?
Чем уже ограничение, тем больше операций доступно внутри метода, но тем меньше типов смогут его вызвать.
Comparator, не согласованный с ==, допустим, но его влияние на уникальность TreeSet надо сделать явным в контракте.
Составной Comparator делает порядок детерминированным, но каждый дополнительный критерий увеличивает стоимость сравнения.
Comparator, не согласованный с equals, допустим, но его влияние на уникальность HashSet надо сделать явным в контракте.
Comparator, не согласованный с equals, допустим, но его влияние на уникальность TreeSet надо сделать явным в контракте.
Вопрос 17 из 20
Что следует изменить в разделе «equals, hashCode и сравнение объектов», чтобы сохранить замысел и соблюсти контракт «Контракты коллекций»?
Java Контракты коллекций · фрагмент для анализа Копировать
// Фрагмент на ревью
record Item(int id, int rank) {}
var byRank = java.util.Comparator.comparingInt(Item::rank);
var set = new java.util.TreeSet<>(byRank);
set.add(new Item(1, 10));
set.add(new Item(2, 10));
System.out.println(set.size());
Обеспечить стабильные equals и hashCode у элементов и не менять поля, участвующие в равенстве, пока объект находится в множестве.
Добавить вторичный критерий thenComparingInt(Item::id), если одинаковый rank не должен объединять разные элементы.
Использовать неизменяемые ключи или исключить изменяемые поля из equals/hashCode.
Добавить вторичный критерий по исходному значению, если оба элемента должны сосуществовать.
Выбрать устойчивые значимые поля и документировать, представляет ли класс сущность или значение.
Вопрос 19 из 20
На какое правило следует опираться при разборе темы «Контракты коллекций» в разделе «equals, hashCode и сравнение объектов»?
TreeSet использует Comparator и для порядка, и для эквивалентности: compare(a, b) == 1 означает один элемент для множества.
Массив имеет фиксированную длину, хранит элементы одного совместимого типа и является ковариантным для ссылочных типов.
TreeSet использует Comparator и для порядка, и для эквивалентности: compare(a, b) == 0 означает один элемент для множества.
equals должен быть рефлексивным, симметричным, транзитивным, согласованным и возвращать false для null.
TreeSet использует Comparator и для порядка, и для эквивалентности: compare(a, b) == -1 означает один элемент для множества.
Вопрос 20 из 20
Какое правило Java действует для темы «Равенство» в разделе «equals, hashCode и сравнение объектов»?
TreeSet использует Comparator и для порядка, и для эквивалентности: compare(a, b) == 0 означает один элемент для множества.
equals должен быть рефлексивным, симметричным, транзитивным, согласованным и возвращать false для null.
== должен быть рефлексивным, симметричным, транзитивным, согласованным и возвращать false для null.
Comparator задаёт полный порядок и должен быть согласованным; нулевой результат означает эквивалентность для TreeSet и TreeMap.
equals сравнивает содержание согласно контракту класса, а == для ссылок проверяет идентичность объектов.