使用自定义类作为键的Java HashSet:“ contains()”函数始终返回false

时间:2018-12-11 11:18:17

标签: java key equals hashset hashcode

我正在尝试使用HashSet,同时将自己的类“ Inner”用作键类型,如下所示:

auth()->user()->onboarding

它显示“ false”

(1)我的问题是,只要尝试使用“包含”功能,就必须从“内部”类构造一个新对象以进行查询,但是因为它是一个新对象,所以hashcode()是不同的。因此,对于“包含”功能,我总是会得到“假”。

(2)如果我更改hashCode()以在值相同时返回“ true”(如等于),那么在其他情况下,就像一个唯一引用一样,将不同的对象引用视为“ ==”。

(1)和(2)似乎冲突。

如何解决这个问题?

谢谢!

2 个答案:

答案 0 :(得分:3)

您应该以两个相等的对象具有相同的hashCode的方式覆盖hashCode

例如:

@Override
public int hashCode() {
    return Objects.hash(i,s);
}

我不确定您(2)的问题是什么。如果根据equals()两个对象相等,则HashSet应将它们视为相同的对象,即使它们不是相同的。

如果另一方面,您希望HashSet将任何一个Inner实例视为唯一的(无论其实例变量的值如何),只需不要覆盖hashCodeequals。但是,使用HashSet而不覆盖这些方法很少有用。

答案 1 :(得分:2)

1)您必须正确覆盖hashCode(),而不能破坏等式-哈希码契约。

2)hashCode()不返回true,它返回int值。因此,只需确保它为equals()返回true的2个不同对象返回相同的int值即可。