gpt4 book ai didi

java - 我可以以这种方式为(哈希)集实现 hashCode 和 equals 吗?

转载 作者:行者123 更新时间:2023-12-02 05:23:51 25 4
gpt4 key购买 nike

我知道如果a.equals(b),我们必须有a.hashCode() == b.hashCode(),否则我们会得到奇怪的结果,但是我想知道是否也需要相反的情况。

更具体地说,我有一个 hashCode() 函数,它使用字段 id 来计算 hashCode。但是,我的 equals() 函数仅使用简单的比较 "==" 来检查是否相等。这可能看起来很奇怪,但除非需要更多细节,否则这就是我实现它的方式。

现在的问题是这会搞砸什么吗?专门针对 HashSet,但更一般而言,针对 Set 的任何(常见)实现。

按照我的理解,Set 将首先检查 hashCode,然后检查 equals 运算符以查看是否存在重复的对象。在这种情况下,它应该有效吗?如果两个对象是同一个实例,它们将产生相同的 hashCode,并且 equals() 返回 true,因此 Set 只允许添加该实例一次。

对于具有相同 id 的两个单独实例,hashCode 将相同,但 equals() 运算符将返回 false,从而允许两个对象进入 Set,这就是我希望的完成。

这是初学者的错误吗?我错过了什么吗?对于除 Set 之外的任何集合类型来说,这是否会产生意外结果?

<小时/>

编辑:

我想我应该解释一下自己。我有一个 Hibernate 对象 FooReference,它使用 id 实现了 hashCode 和 equals 方法。该对象保证始终具有唯一的 id。但是,在持久化该对象之前,我使用默认 id 为 -1 的 Foo 对象。因此,当将其放入 Set 中(要保存)时,我知道每个 Foo 都是唯一的(因此是基本的 == 运算符)。因此,这个扩展了 FooReference 的 Foo 使用基本的 == 覆盖了 equals 方法。就我的目的而言,这应该可行......希望如此。

最佳答案

对象可以具有相同的哈希码,但彼此不相等。事实上,将 hashCode 实现为简单的 return 0 是完全有效的(尽管效率低且不是一个好主意),为每个实例提供相同的哈希码。

所需要的只是,如果两个对象相等(由 equals 方法确定),则它们具有相同的哈希码。

但是,如果您的 equals 方法只是在内部使用 == 比较两个对象,则没有两个(不同的)实例将彼此相等,因此不存在完全定义您自己的 hashCodeequals 方法。默认实现将产生相同的行为。

关于java - 我可以以这种方式为(哈希)集实现 hashCode 和 equals 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26248807/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com