Выбор ответа Middle ООП и класс Object спрашивают часто обновлено

Изменили поле ключа в HashSet

Вопрос

Объект положили в HashSet, потом изменили поле, которое участвует в hashCode. Что будет при set.contains(obj) с тем же объектом?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Обычно false: объект в корзине старого хеша, ищут по новому. Корзина вычисляется при вставке.

Варианты ответа

  1. true: это тот же самый объект, ссылка совпадает
  2. HashSet автоматически перехеширует элемент при изменении
  3. ConcurrentModificationException при поиске изменённого объекта
  4. Обычно false: объект в корзине старого хеша, ищут по новомуправильный ответ

Разбор

Корзина вычисляется при вставке. После изменения hashCode поиск идёт в другую корзину и объект не находится, хотя он в множестве (и remove его тоже не удалит). Это утечка и баг. Что это «тот же объект», не важно: до сравнения ссылок дело не доходит. Автоматического перехеширования нет, ConcurrentModificationException бросают итераторы при структурном изменении во время обхода. Вывод: ключи и элементы хеш-коллекций делают неизменяемыми.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.