我知道java 对象头包含诸如哈希码,gc年,偏向锁等信息。然后一个难题来找我,并明确表达我的问题。我举一个例子。
下面是代码:什么时候jvm分配对象头中的hashcode值
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方法这个对象。 但是根据输出,它似乎没有调用hashCode方法当新的对象。并且将值添加到hashSet hashCode方法被调用,这正如预期的那样。
所以我的问题是:何时jvm分配对象头中的哈希码值?它发生在新的对象的阶段?
- 如果是。为什么它没有调用哈希码方法,而没有这个如何计算哈希码这个对象。
- 如果第唔......这是毫无意义的是更新哈希码在对象头每次调用调用hashCode方法。