Почему вызов объекта toString() влияет на вывод заголовка объекта? Я использую пакет jol
Код L очень простой
public class L {
}
public class Synchronized1 {
public static void main(String[] args) {
L l=new L();
// System.out.println(l.toString());
System.out.println(ClassLayout.parseInstance(l).toPrintable());
}
}
Раскомментирование и повторный запуск кода приведет к другим результатам или двум совершенно разным результатам. Я хочу знать, в чем причина такого результата? Не только вызов toString() влияет на результат, но и вызов других методов объекта также влияет на результат, например hashCode()
1 ответ
Ваш пустой класс class L
использует значение по умолчанию toString()
унаследовано от class Object
.
По умолчанию toString()
призывает hashCode()
.
И как вы уже видели, hashCode()
также, похоже, влияет на заголовок объекта.
Итак, по сути, проблему можно сформулировать так: "Почему звонки hashCode()
изменить заголовок моего объекта?"
Как другие уже указывали в комментариях, это происходит потому, что в конкретной реализации JVM, которую вы используете, хэш-код объекта вычисляется в первый раз. hashCode()
вызывается, а затем кэшируется в заголовке, так что последующие вызовы hashCode()
может просто вернуть кешированное значение, не вычисляя его заново.
Помимо производительности, для этого может быть еще более важная причина.
В зависимости от того, как JVM, которую вы используете, вычисляет хэш-коды, в вычислениях может быть случайность или может быть постоянно увеличивающееся начальное число, поэтому может случиться так, что последующие попытки воспроизвести хэш-код объекта не будут иметь никаких средств генерации того же значения, что и первое вычисление. Это означает, что самое первое вычисление должно определить, каким будет значение хэш-кода навсегда.