【发布时间】:2014-02-17 17:55:00
【问题描述】:
我有一个类,它是一个 Set,我重写 .equals() 以检查集合是否在元素方面相等。我如何覆盖 HashCode,因为据我所知,两者之间存在一些相互依赖
public class ASet{
Set g=new Set();
public boolean equals(Object s1)
{
Set S= (Set)s1;
for(Object o : S.getcontents())
{
for(Object r : g.getcontents())
{
if(!o.equals(r))
{
return false;
}
}
}
return true;
}
public int hashCode() {
?????????
}
【问题讨论】:
-
除非您想将此 Set 放入另一个 HasSet 或 HashMap 中,否则您不需要覆盖 hashCode。
-
为什么要包装 Set ?
-
顺便说一句,我认为您的等号不正确。如果任一集合包含超过 1 个元素,它将始终返回 false。
-
@TwilightSun:无论何时你覆盖
equals(),你都应该覆盖hashCode()。 -
忽略其他评论者提出的实现问题,在the javadocs for Object中明确定义了hashCode的实现规则。在这种情况下,如果两个 ASet 具有相同的 getcontents,那么它们应该返回相同的 hashCode()。由于您不太可能拥有一组哈希 ASet(因为您不会再次使用此代码),因此只需
return 1;并且您的 hashCode() 将是有效的。