Java hashCode() 方法是否是对象相等性的可靠度量?



我目前正在比较两个相同类型的复杂对象,其中多个字段由自定义对象类型的数据结构组成。假设没有一个自定义对象覆盖了 hashCode() 方法,如果我比较对象中每个字段的哈希代码,并且它们会变得相同,我是否有 100% 的置信度比较对象的内容是相同的?如果没有,假设我不能使用任何外部库,您建议使用哪种方法来比较两个对象。

绝对不是。您应该使用 hashCode() 作为第一次传递 - 如果哈希代码不同,您可以假设对象不相等。如果哈希代码相同,则应调用 equals() 来检查是否完全相等。

这样想:只有 232 个可能的哈希码。例如,有多少种可能的不同对象 String 类型?远不止于此。因此,至少两个不相等的字符串必须共享相同的哈希代码。

Eric Lippert在哈希代码方面写得很好 - 诚然,从.NET的角度来看,但原理是相同的。

不,没有hashCode()碰撞只意味着对象可能是相同的,这绝不是保证。

唯一的保证是,如果hashCode()值不同(并且hashCode()/equals()实现正确),则对象将不会equal

此外,如果您的自定义类型没有hashCode()实现,则该值对于比较对象的内容完全无用,因为它将是identityHashCode()

如果您尚未重写 hashCode() 方法,则所有对象都是不相等的。通过覆盖它,您可以提供比较的逻辑。请记住,如果您覆盖 hashCode(),则绝对应该覆盖 equals()编辑:当然,仍然可能存在冲突,但是如果您没有覆盖equal(),则您的对象将通过引用进行比较(对象等于自身)。

Object.hashCode() 通常的 JVM 实现是以某种格式返回对象的内存地址,因此从技术上讲,这将用于您想要的内容(因为没有两个对象可以共享相同的地址)。

但是,Object.hashCode()的实际规范并不能保证,也不应在任何合理或编写良好的代码中用于此目的。

我建议使用 Apache commons 库中可用的 hashCode 和 equals 构建器,或者如果你真的不能使用免费的外部库,看看它们以获得灵感。但是,使用的最佳方法完全取决于"等于"在应用程序域上下文中的实际含义。

相关内容

  • 没有找到相关文章

最新更新