有关equals和hashCode的更多信息

Kee*_*thi 0 java hashcode

我理解equalshashCode方法之间的契约.如果equals被覆盖,hashCode也应该是.我可以覆盖hashCode方法以始终返回相同的值,比如int 23吗?我可以覆盖hashCode每次调用时返回随机数的方法吗?

Era*_*ran 5

您不应该覆盖hashCode以返回随机值.它应始终为同一实例返回相同的值.

这在Javadoc中有明确说明:

每当在执行Java应用程序期间多次在同一对象上调用它时,hashCode方法必须始终返回相同的整数,前提是不修改对象上的equals比较中使用的信息.

你不应该返回一个常量值,因为hashCode当它在诸如HashMap和等的类中使用时会变得非常差HashSet.

这在Javadoc中也有提到:

如果两个对象根据equals(java.lang.Object)方法不相等,则不需要在两个对象中的每一个上调用hashCode方法必须生成不同的整数结果.但是,程序员应该知道为不等对象生成不同的整数结果可能会提高哈希表的性能.