Object.hashCode()方法中发生了什么?

时间:2015-10-09 14:51:51

标签: java hashcode

据我所知,Object.hashCode()方法已实施native。我特别感兴趣的是:这种方法有任何随机化吗? 我没有重新定义hashCode方法从Object.class直接派生类。如果我错了,请纠正我,但当我们调用==运算符时,我们会比较这些对象的引用,别名比较哈希码。 所以我们总是得到false

//pseudocode
new SomeObject(3) == new SomeObject(3)    

因为Object.hashCode()方法涉及随机化?

2 个答案:

答案 0 :(得分:3)

对象hascode只是hash,而不是指针。因此==将比较引用而不是哈希码。

来自spec的hashCode的一般合约是:

  
      
  • 每当在同一个对象上多次调用它时   执行Java应用程序时,hashCode方法必须始终如一   返回相同的整数,前提是equals中没有使用的信息   对象的比较被修改。不需要保留该整数   从一个应用程序的执行到另一个执行的一致性   相同的申请。

  •   
  • 如果两个物体相等则   equals(Object)方法,然后在每个上调用hashCode方法   两个对象必须产生相同的整数结果。

  •   
  • 不需要   如果两个对象根据不相等而不相等   equals(java.lang.Object)方法,然后调用hashCode方法   两个对象中的每一个都必须产生不同的整数结果。   但是,程序员应该意识到产生了不同的   不等对象的整数结果可以提高性能   哈希表。

  •   

关键字native告诉我们使用JNI(Java Native Interface)在本机代码上完成实现。

此外,如果您重写hashcode方法,请不要忘记您的实现应该满足上述合同,否则您可能会得到错误的输出,使用它。说HashMap类。

更多信息:What issues should be considered when overriding equals and hashCode in Java?

答案 1 :(得分:1)

  

据我所知,Object.hashCode()类是原生的。

正确。

  

我特别感兴趣的是:这种方法有任何随机化吗?

Object.hashCose() IS 返回的哈希码,通常是,基于对象在其生命周期中某个时间的机器地址。地址以及哈希码可能会受到各种随机因素的影响,具体取决于应用程序。

但是,这并不意味着哈希码是随机的。实际上,如果你一个接一个地分配了两个对象并且立即获得了它们的哈希码,那么可能两个哈希码之间会有很强的相关性。

可能......但不能保证。

  

如果我错了,请纠正我,但当我们调用==运算符时,我们会比较这些对象的引用。

正确。

  

...别名比较哈希码。

如果你说==涉及哈希码,那就是不正确。 ==是通过比较对象的当前机器地址来实现的。

  

因为Object.hashCode()方法涉及随机化,所以我们总是会弄错吗?

没有。在您的示例中,您得到false因为对象引用不同!

实际上,两个不同的Object实例可能具有相同的哈希码。

  o1 == o2 IMPLIES o1.hashcode() == o2.hashcode()    is TRUE

  o1.hashcode() == o2.hashcode() IMPLIES o1 == o2    is FALSE