Ваш пустой класс class L
использует значение по умолчанию toString()
, унаследованное от class Object
.
Значение по умолчанию toString()
вызывает hashCode()
.
И, как вы уже видели,hashCode()
также, похоже, влияет на заголовок объекта.
Таким образом, по сути, проблему можно переформулировать как «Почему вызов hashCode()
изменяет заголовок моего объекта?»
Как уже отмечали другие в комментариях, это происходит потому, что в используемой вами конкретной реализации JVM хэш-код объекта вычисляется при первом вызове hashCode()
, а затем он кэшируется в заголовке, поэтомучто последующие вызовы hashCode()
могут просто возвращать кэшированное значение без необходимости его повторного вычисления.
Помимо производительности, для этого может быть еще более важная причина.
В зависимости от того, как JVM, которую вы используете, вычисляет хеш-коды, в вычислениях может присутствовать случайность или может происходить постоянно увеличивающееся начальное число, поэтому может случиться так, что последующееempts для воспроизведения хеш-кода объекта не будет иметь возможности генерировать точно такое же значение, как при первом вычислении.Это означает, что самое первое вычисление должно определить, каким будет значение хеш-кода навсегда.