пятница, 22 апреля 2016 г.

Может ли значение java.lang.Object#hashCode измениться в течение жизни объекта?

Прежде чем читать дальше статью, попробуйте сами ответить на вопрос "Может ли значение java.lang.Object#hashCode измениться в течение жизни объекта?". Речь идет про стандартный hashCode из java.lang.Object.


Вообще вопрос был задан не с проста. Подводный камень в том, что после создания объекта он может быть перемещен сборщиком мусора. Ведь есть несколько областей памяти. Eden, survivor 1, survivor 2 (что в сумме равно Young generation) и Old generation. Соответственно во время работы сборщика мусора объекты могут перемещаться между этими областями и, следовательно, адреса объектов будут меняться. Если после прочтения вышеупомянутого вы подумали и решили ответить на главный вопрос положительно, то ответьте на еще один вопрос. Если объект уже положили в HashMap, то как же этот объект будет найден после работы сборщика мусора? Может объект потеряется?

На самом деле ничего не потеряется по одной простой причине, что hashCode не поменяется для объекта ни при каких обстоятельствах. Реализовано это на практике достаточно просто и очевидно. Раз нам необходимо всегда иметь одно и тоже значение hashCode, то надо его где-то сохранить. Самое хорошее место для этого как уже наверное догадались java.lang.Object. Но зачем хранить hashCode если для каких-то объектов он не нужен и никогда не используется?Для этого были введены еще 2 флага. Первый флаг отвечает за то были ли вызван хоть раз hashCode у объекта, а второй говорит о том, использовать ли текущий адрес объекта или взять уже сохраненное значение. Первый флаг устанавливается при вызове hashCode и, собственно, когда значение записывается в конец объекта, то устанавливается второй флаг и при последующих вызовах будет браться уже записанное ранее значение.

Комментариев нет:

Отправить комментарий