我知道如果a.equals(b)
,我们必须a.hashCode() == b.hashCode()
我们会得到奇怪的结果,但我想知道是否还需要反过来。
更具体地说,我有一个hashCode()
函数,它使用字段id来计算hashCode。但是,我的equals()
函数仅使用简单比较"=="
来检查是否相等。这可能看起来很奇怪,但除非需要更多细节,否则我只是如何实现它。
现在问题是这会弄得一团糟吗?特别是对于HashSets,但更一般地说,对于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方法。为了我的目的,这应该有用......希望如此。
答案 0 :(得分:2)
允许对象具有相同的哈希码,而不是彼此相等。实际上,将hashCode
简化为return 0
非常有效(尽管效率低且不太好),为每个实例提供相同的哈希码。
所需要的只是两个对象相等(由equals
方法确定),它们具有相同的哈希码。
但是,如果你的equals
方法只是在内部使用==
比较两个对象,那么没有两个(不同的)实例将彼此相等,所以没有必要定义你自己的{{1}和} hashCode
方法。默认实现将产生相同的行为。