[英]Different fields for equals and hashcode
我同意本文中的说法, 在Java中重写equals和hashCode时应考虑哪些问题?
使用用于计算equals()和计算hashCode()的同一组字段。
但是我有一些疑问:
具有相同的字段是否绝对必要?
是的,如果您不希望有任何惊喜。
如果是,如果我不使用同一字段怎么办?
根据equals()
方法,对于相等的对象,您可能会获得不同的hashCode
,这是equals和hashCode契约的要求。
例如,假设你已经3场- a
, b
, c
。 然后,将a
和b
用于equals()
方法,并将所有3个字段用于hashCode()
方法。 因此,对于2个对象,如果a
和b
相等,并且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.