在什么条件下两个不同的对象可能具有相同的hashcode()值..?

时间:2015-07-02 13:07:33

标签: java hashcode

我所知道的是: -

int hashCode()返回对象的内存地址 对象的默认哈希值。“

如果引用xy表示两个不同的对象,则表达式 (x.hashCode() == y.hashCode())并非总是错误

所以,我想问一下两种不同对象的哈希值是否相同。

3 个答案:

答案 0 :(得分:6)

您可以在班级中覆盖equals。您通常会覆盖它以及覆盖a.equals(b),因此如果a.hashCode() == b.hashCode()为真,(a == b)也为真(即使a.equals(b)为false)。

但是,即使a.hashCode() == b.hashCode()为false,Sidekiq.redis {|c| c.del('stat:processed:2015-07-02') } Sidekiq.redis {|c| c.del('stat:failed:2015-07-02') } 仍可能为真。

正如你在Object类的Javadoc中看到的那样:

  
      
  • 如果两个对象根据equals(Object)方法相等,则必须对两个对象中的每一个调用hashCode方法   产生相同的整数结果。
  •   
  • 根据java.lang.Object.equals(java.lang.Object)方法,如果两个对象不相等则不需要调用   每个两个对象上的hashCode方法必须产生不同的   整数结果。但是,程序员应该意识到这一点   为不相等的对象产生不同的整数结果可以改善   哈希表的表现。
  •   

答案 1 :(得分:1)

HashCode不会总是返回内存地址(由于对象可能会重新定位在内存中,因此本身可能是假的)。提供自己的hashCode的类可能有一个导致冲突的算法(两个不同的对象具有相同的hashCode)。

此外,您可以参与equals:两个对象,其中a!=ba.equals(b)为真,必须具有相同的hashCode或某些数据结构,例如hashmaps,hashsets,LRU caches等将无法正常工作。 但是,如果两个不相等的对象具有相同的hashCode,则不会产生任何问题 - 在许多情况下使用hashCode作为性能改进的提示(例如在hashMap中)。虽然糟糕的hashCode实现(例如return 1;)不会导致正确编写的数据结构失败,但它们会导致性能下降(例如,在HashMap的情况下,分摊的O(1)变为O(N))。

第三,如果该类的对象超过4,294,967,296个,那么即使最好的hashCode也必然会发生冲突。这是因为只有4,294,967,296个distict hashCode值,因为hashCode是一个int,而且是pigeonhole原则。

Object#hashCode()的合同以及所有重要的实施:

  

如果两个对象根据equals(Object)方法相等,则对两个对象中的每一个调用hashCode方法必须产生相同的整数结果。

     

如果两个对象根据java.lang.Object.equals(java.lang.Object)方法不相等,则不需要在两个对象中的每一个上调用hashCode方法必须生成不同的整数结果。但是,程序员应该知道为不等对象生成不同的整数结果可能会提高哈希表的性能。

答案 2 :(得分:0)

"返回内存地址" hashCode的实施是默认。几乎总是,当您在HashMap或HashSet中使用某种类型的对象或者您拥有什么时,您将使用自己的实现覆盖 hashCode,可能与对象的内存地址没有任何关系。