理解Java中hashcode和equals方法之间的关系

时间:2014-08-09 19:48:33

标签: java equals hashcode

这是我对hashcode和equals方法的理解:

  
      
  • 如果obj1.hashcode == obj2.hashcode(返回true)则obj1.equals(obj2)返回true并且
  •   
  • 如果obj1.equals(obj2)返回false(返回true)则obj1.hashcode == obj2.hashcode(返回false)
  •   

这是正确的吗?

3 个答案:

答案 0 :(得分:1)

  

如果obj1.hashcode == obj2.hashcode(返回true),则obj1.equals(obj2) 可能会返回true

From the javadoc

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

答案 1 :(得分:1)

equals()hashCode()之间的convention强制要求:

  • 如果确定某个对象相等,则其哈希码必须* 相等。也就是说,如果obj1.equals(obj2),则为obj1.hashCode() == obj2.hashCode()

  • 如果确定一个对象相等,那么它们之间的哈希码应该没有硬性规则。他们可以返回相同的哈希码,但这可能会导致大量错误。

*:这个“必须”在编译时或运行时实际上是不可执行的,所以请耐心等待。请注意,如果未正确实施,则会使用equals / hashCode用法来破坏应用程序的正确性。

答案 2 :(得分:1)

不正确Object.equals(Object)的文档正式解释了扩展此方法的合同。基本上Object.equals方法的意图是检查两个对象是否实际上是同一个对象。但是,覆盖此功能通常是有意义的,而是使您的类'equals方法确定两个对象逻辑是否彼此相等(例如,两个不同的String对象实例,两者都是代表相同的句子。)

另一方面,Object.hashCode()指定以下合同:

  

hashCode的一般合约是:

     
      
  • 每当在执行Java应用程序期间多次在同一对象上调用它时,hashCode方法必须   如果没有使用任何信息,则始终返回相同的整数   等于对象的比较被修改。这个整数不需要   从应用程序的执行到另一个应用程序保持一致   执行相同的应用程序。
  •   
  • 如果两个对象根据equals(Object)方法相等,则必须对两个对象中的每一个调用hashCode方法   产生相同的整数结果。
  •   
  • 如果两个对象根据equals(java.lang.Object)方法不相等,则不需要调用hashCode方法   两个对象中的每一个都必须产生不同的整数结果。   但是,程序员应该意识到产生了不同的   不等对象的整数结果可以提高性能   哈希表。
  •   
     

尽可能合理,Object类定义的hashCode方法确实为不同的对象返回不同的整数。 (这通常通过将对象的内部地址转换为整数来实现,但Java™编程语言不需要此实现技术。)

基本上,两个不同的对象(逻辑上不同或技术上不同)可能具有相同的哈希码,因为哈希码是如何设计的,但它们不应该是“等于”。但是,如果两个对象彼此相等,则必须具有相同的哈希码。类似地,对象的哈希码只有在对象本身以某种方式发生变化时才会改变。

有关进一步阅读,请参阅hash functions上的维基百科文章。