我了解到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);
}
}
输出:
after generate an object
the hashCode method was called
我想当我们新建一个对象时, jvm 会在对象标头中设置 hashcode 。但是如果为了生成hashCode,它应该调用此对象的 hashCode方法。 然而根据输出似乎没有在新的对象时调用 hashCode方法。并将值添加到hashSet中,调用 hashCode方法,这是预期的。
所以我的问题是:jvm什么时候在对象头中分配哈希码值?它发生在新物体的阶段?
答案 0 :(得分:4)
hashCode
方法来初始化对象的标识hashCode。它反过来工作:Object.hashCode
和System.identityHashCode
调用JVM来计算或提取先前计算的身份hashCode。Object.hashCode
或System.identityHashCode
时计算身份hashCode,并将其存储在对象标头中。后续调用只是从标题中提取先前计算的值。