Почему вызов объекта 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, которую вы используете, вычисляет хэш-коды, в вычислениях может быть случайность или может быть постоянно увеличивающееся начальное число, поэтому может случиться так, что последующие попытки воспроизвести хэш-код объекта не будут иметь никаких средств генерации того же значения, что и первое вычисление. Это означает, что самое первое вычисление должно определить, каким будет значение хэш-кода навсегда.

Другие вопросы по тегам