Изменили поле ключа в HashSet
Вопрос
Объект положили в HashSet, потом изменили поле, которое участвует в hashCode. Что будет при set.contains(obj) с тем же объектом?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
true: это тот же самый объект, ссылка совпадает- HashSet автоматически перехеширует элемент при изменении
- ConcurrentModificationException при поиске изменённого объекта
- Обычно
false: объект в корзине старого хеша, ищут по новомуправильный ответ
Разбор
Корзина вычисляется при вставке. После изменения hashCode поиск идёт в другую корзину и объект не находится, хотя он в множестве (и remove его тоже не удалит). Это утечка и баг. Что это «тот же объект», не важно: до сравнения ссылок дело не доходит. Автоматического перехеширования нет, ConcurrentModificationException бросают итераторы при структурном изменении во время обхода. Вывод: ключи и элементы хеш-коллекций делают неизменяемыми.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.