我正在尝试使用HashSet,同时将自己的类“ Inner”用作键类型,如下所示:
auth()->user()->onboarding
它显示“ false”
(1)我的问题是,只要尝试使用“包含”功能,就必须从“内部”类构造一个新对象以进行查询,但是因为它是一个新对象,所以hashcode()是不同的。因此,对于“包含”功能,我总是会得到“假”。
(2)如果我更改hashCode()以在值相同时返回“ true”(如等于),那么在其他情况下,就像一个唯一引用一样,将不同的对象引用视为“ ==”。
(1)和(2)似乎冲突。
如何解决这个问题?
谢谢!
答案 0 :(得分:3)
您应该以两个相等的对象具有相同的hashCode
的方式覆盖hashCode
。
例如:
@Override
public int hashCode() {
return Objects.hash(i,s);
}
我不确定您(2)的问题是什么。如果根据equals()
两个对象相等,则HashSet
应将它们视为相同的对象,即使它们不是相同的。
如果另一方面,您希望HashSet
将任何一个Inner
实例视为唯一的(无论其实例变量的值如何),只需不要覆盖hashCode
和equals
。但是,使用HashSet
而不覆盖这些方法很少有用。
答案 1 :(得分:2)
1)您必须正确覆盖hashCode()
,而不能破坏等式-哈希码契约。
2)hashCode()
不返回true,它返回int值。因此,只需确保它为equals()
返回true的2个不同对象返回相同的int值即可。