2017-02-23 142 views
2

я узнал, что ява объекта заголовок содержит информацию, такую ​​как хэша-кода, гй год, необъективный замок и так далее. Затем придет ко мне головоломка и явным образом выражу свой вопрос. Приведу пример.
Вот код:Когда значение хэша-кода JVM правопреемника в заголовке объекта

public class Demo{ 
    @Override 
    public int hashCode(){ 
     System.out.println("the hashCode method was called"); 
     return super.hashCode(); 
    } 

    public static void main(String[] args){ 
     Demo demo = new Demo(); 
     System.out.println("after generate an object"); 
     // 
     Set<Demo> set = new HashSet<Demo>(); 
     set.add(demo); 
    } 
} 

И выход:

after generate an object 
the hashCode method was called 

Я думаю, когда мы новый объект осуществляется JVM установит хэша в заголовке объекта. Но если это для генерации hashCode, он должен вызывать метод hashCode этого объекта. Однако в соответствии с выходом, который казался ему havent invoke hashCode method когда новый объект. И добавить значение в hashSet вызывается метод hashCode, как и следовало ожидать.

Итак, мой вопрос в том, что: когда jvm присваивает значение hashcode в заголовке объекта? Это произошло в фазе, когда новый объект?

  • Если да. Почему он havent вызывает метод hashcode, и без этого, как рассчитать hashcode этого объекта.
  • Если номер Уххх ... Это не имеет смысла, что обновление хэш в объекта заголовка каждый вызвать вызвать метод Hashcode.

ответ

3
  • JVM не требует вызова метода hashCode для инициализации идентификатора объекта hashCode. Он работает наоборот: Object.hashCode и System.identityHashCode вызывают JVM для вычисления или извлечения ранее вычисленного идентификатора hashCode.
  • Не указано, как JVM генерирует и сохраняет идентификатор hashCode. Различные реализации JVM могут делать это по-другому.
  • HotSpot JVM вычисляет идентификатор hashCode при первом вызове Object.hashCode или System.identityHashCode и сохраняет его в заголовке объекта.Последующие вызовы просто извлекают ранее вычисленное значение из заголовка.
4

Я думаю, что вы вводите в заблуждение хэш-код и идентификатор-hashcode.

Хэш-код объекта не сохраняется в заголовке объекта, но вычисляется путем вызова метода hashcode по мере необходимости. В вашем примере hashcode вызывается, потому что вы добавляете свой объект в HashSet.

Идентификатор hashcode вычисляется JVM при создании объекта и служит, среди прочих, как резерв для значения хэш-кода объекта. То есть Object.hashcode() вернет идентификатор хэш-кода вашего объекта. Это значение будет не изменение в течение всего срока службы вашего объекта.

Для получения дополнительной информации см. this question.