【发布时间】:2017-02-23 10:59:50
【问题描述】:
了解到java的object header包含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方法,没有这个怎么计算这个对象的hashcode。
- 如果不是。呃……每次调用 invoke hashCode 方法时更新 object header 中的 hashcode 是没有意义的。
【问题讨论】: