我了解到java 对象头包含hashcode,gc year,biased lock等信息.然后一个谜题来到我面前,为了明确表达我的问题.我举个例子.
这是代码:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
并输出:
after generate an object
the hashCode method was called
Run Code Online (Sandbox Code Playgroud)
我想当我们新建一个对象时,jvm会在对象头中设置hashcode.但是如果为了生成hashCode,它应该调用这个对象的hashCode方法. 但是根据输出似乎它没有在新的对象时调用hashCode方法.并将值添加到hashSet 中调用hashCode方法,这是预期的.
所以我的问题是:jvm什么时候在对象头中分配哈希码值?它发生在一个新的对象阶段?
hashCode方法来初始化对象的身份hashCode。它以相反的方式工作:Object.hashCode并System.identityHashCode调用JVM以计算或提取先前计算的身份hashCode。Object.hashCode或时会计算标识hashCode,System.identityHashCode并将其存储在对象标头中。后续调用仅从标头中提取先前计算的值。