jvm何时在对象头中分配哈希码值

时间:2017-02-23 10:59:51

标签: java jvm

我了解到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什么时候在对象头中分配哈希码值?它发生在新物体的阶段?

  • 如果是的话。为什么它没有调用哈希码方法,没有这个如何计算这个对象的哈希码
  • 如果不是......在对象标头中更新哈希码没有意义,每次调用都会调用hashCode方法

1 个答案:

答案 0 :(得分:4)

  • JVM不需要调用hashCode方法来初始化对象的标识hashCode。它反过来工作:Object.hashCodeSystem.identityHashCode调用JVM来计算或提取先前计算的身份hashCode。
  • 未指定JVM如何生成和存储标识hashCode。不同的JVM实现可能会采用不同的方式。
  • HotSpot JVM 在第一次调用Object.hashCodeSystem.identityHashCode时计算身份hashCode,并将其存储在对象标头中。后续调用只是从标题中提取先前计算的值。