equals和hashcode的不同字段

时间:2014-04-03 04:06:44

标签: java hashmap equals hashcode

我同意这篇文章What issues should be considered when overriding equals and hashCode in Java?

中的陈述
  

使用用于计算equals()的同一组字段来计算hashCode()。

但我有些怀疑:

  • 这是否必须具有相同的字段?
  • 如果是,如果我不使用相同的字段怎么办?
  • 它会影响HashMap性能还是HashMap准确度?

3 个答案:

答案 0 :(得分:2)

  

这是否必须具有相同的字段?

是的,如果你不想要任何意外。

  

如果是,如果我不使用相同的字段怎么办?

根据hashCode方法,对于equals和hashCode合约的要求,对于相等的对象,可能会得到不同的equals()

例如,假设您有3个字段 - abc。您使用ab用于equals()方法,并使用hashCode()方法的所有3个字段。因此,对于2个对象,如果ab相等,并且c不同,则两者都将等于不同的哈希码。

  

它会影响HashMap性能还是HashMap准确度?

这不是关于性能,而是你的地图不会按预期运行。

答案 1 :(得分:2)

这些字段不必相同。要求是两个相等的对象,它们必须具有相同的哈希码。如果它们具有相同的哈希码,则它们不必相等。来自javadocs:

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

例如,您可以始终返回1作为哈希代码,并且无论您在equals方法中使用哪个字段,都会遵守哈希代码协定。

一直返回1会改善hashCode的计算时间,但HashMap的性能会下降,因为它必须更频繁地使用equals()。

答案 2 :(得分:0)

哈希码中使用的字段可以是等于中使用的字段的子集。 它仍然会遵守“只要a.equals(b),那么a.hashCode()必须与b.hashCode()相同”的规则