Почему вызов объекта toString () влияет на вывод заголовка объекта?Я использую пакет JOL - PullRequest
4 голосов
/ 25 сентября 2019
Код

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 ()

toString() After the comments

1 Ответ

3 голосов
/ 25 сентября 2019

Ваш пустой класс class L использует значение по умолчанию toString(), унаследованное от class Object.

Значение по умолчанию toString() вызывает hashCode().

И, как вы уже видели,hashCode() также, похоже, влияет на заголовок объекта.

Таким образом, по сути, проблему можно переформулировать как «Почему вызов hashCode() изменяет заголовок моего объекта?»

Как уже отмечали другие в комментариях, это происходит потому, что в используемой вами конкретной реализации JVM хэш-код объекта вычисляется при первом вызове hashCode(), а затем он кэшируется в заголовке, поэтомучто последующие вызовы hashCode() могут просто возвращать кэшированное значение без необходимости его повторного вычисления.

Помимо производительности, для этого может быть еще более важная причина.

В зависимости от того, как JVM, которую вы используете, вычисляет хеш-коды, в вычислениях может присутствовать случайность или может происходить постоянно увеличивающееся начальное число, поэтому может случиться так, что последующееempts для воспроизведения хеш-кода объекта не будет иметь возможности генерировать точно такое же значение, как при первом вычислении.Это означает, что самое первое вычисление должно определить, каким будет значение хеш-кода навсегда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...