我已经了解到,java 对象头包含诸如哈希码、gc年、、偏置锁等信息。然后,一个谜题出现在我的脑海中,并明确地表达了我的问题。我举一个例子。
以下是代码:
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什么时候在对象头中分配哈希码值?它发生在新对象的阶段吗?
发布于 2017-02-23 12:29:46
hashCode方法来初始化对象的标识hashCode。相反,它的工作方式是:Object.hashCode和System.identityHashCode调用JVM来计算或提取以前计算的标识hashCode。Object.hashCode或System.identityHashCode时计算标识hashCode,并将其存储在对象头中。随后的调用只是从标头中提取先前计算出来的值。发布于 2017-02-23 11:14:57
我觉得你把哈希码和身份哈希码搞混了。
对象的哈希码不会存储在对象头中,而是根据需要调用hashcode方法来计算。在您的示例中,之所以调用哈希代码,是因为要将对象添加到HashSet中。
标识哈希码由JVM在对象创建时计算,并作为对象的hashcode值的后盾。也就是说,Object.hashcode()将返回对象的标识哈希码。在对象的生存期内,此值将而不是更改。
有关更多细节,请参见this question。
https://stackoverflow.com/questions/42413819
复制相似问题