繁体   English   中英

等于和哈希码的不同字段

[英]Different fields for equals and hashcode

我同意本文中的说法, 在Java中重写equals和hashCode时应考虑哪些问题?

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

但是我有一些疑问:

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

具有相同的字段是否绝对必要?

是的,如果您不希望有任何惊喜。

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

根据equals()方法,对于相等的对象,您可能会获得不同的hashCode ,这是equals和hashCode契约的要求。

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

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

这与性能无关,但是是的,您的地图将无法达到预期的效果。

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

  • 在Java应用程序的执行过程中,只要在同一对象上多次调用它,则hashCode方法必须一致地返回相同的整数,前提是未修改该对象的equals比较中使用的信息。 从一个应用程序的执行到同一应用程序的另一执行,此整数不必保持一致。
  • 如果根据equals(Object)方法,两个对象相等,则在两个对象中的每个对象上调用hashCode方法必须产生相同的整数结果。
  • 根据equals(java.lang.Object)方法,如果两个对象不相等,则不需要在两个对象中的每个对象上调用hashCode方法必须产生不同的整数结果。 但是,程序员应该意识到,为不相等的对象生成不同的整数结果可能会提高哈希表的性能。

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

始终返回1可以改善hashCode的计算时间,但是HashMap的性能会下降,因为它不得不更频繁地使用equals()。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM