我同意这篇文章What issues should be considered when overriding equals and hashCode in Java?
中的陈述使用用于计算equals()的同一组字段来计算hashCode()。
但我有些怀疑:
答案 0 :(得分:2)
这是否必须具有相同的字段?
是的,如果你不想要任何意外。
如果是,如果我不使用相同的字段怎么办?
根据hashCode
方法,对于equals和hashCode合约的要求,对于相等的对象,可能会得到不同的equals()
。
例如,假设您有3个字段 - a
,b
,c
。您使用a
和b
用于equals()
方法,并使用hashCode()
方法的所有3个字段。因此,对于2个对象,如果a
和b
相等,并且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()相同”的规则