是否有必要重写非哈希数据结构中的 hashcode 方法

jay*_*att 0 java equals hashmap hashcode

我对Java中对象的哈希码方法的理解是:需要计算对象的哈希码,该哈希码又用于计算对象在哈希数据结构(如hashMap)中的索引/存储桶位置。

那么,对于不与哈希数据结构一起使用的类,不需要在其中实现 hashCode() 方法,这样说是否正确?换句话说,对于非哈希数据结构来说,重写 equals() 方法是否足够?

如果我的假设是错误的,也请纠正我。

Joa*_*uer 6

从理论上讲,您是正确的:如果您知道您的对象永远不会以任何需要哈希码的方式使用,那么不实现hashCode不会导致任何不好的情况发生。

在实践中,有理由不依赖这一事实:

  1. 由于需求发生了变化,代码更改和最初计划仅存在于非散列结构中的对象被放入集合中或用作映射的键​​。如果你不执行的hashCode话,事情可能会变得很糟糕。
  2. 如果你实施equals并且不实施hashCode,那么你几乎肯定会违反合同,hashCode要求它与 保持一致equals。如果您的代码破坏了其他代码所依赖的合同,那么其他代码可能会以意外/奇怪的方式默默地失败。
  3. 为了避免错误,通常最好让您的 IDE 生成equals,如果您这样做hashCode,同时生成适当的文件就不需要额外的努力。

请注意,所有这些都假设您甚至想要实现equals:如果您完全不关心对象的相等性(这实际上很常见,并非每种类型都需要特定的相等性定义),那么您可以直接离开equals hashCode退出您的对象。代码并且都是一致的(尽管您的类型可能与您类型的“直观”相等定义不匹配)。