设置关注唯一性,因此在我们的程序中实现set时,我们必须覆盖serf
java.lang.Object
和equals()
方法,这样我们才能得到重复项。引用在JVM的单个和当前实例的上下文中保持其有效性,记住这一点我试图以这种方式编写我的程序。在hashCode()
内(第4-6行)。我试图通过在这些行中使用注释以实用的方式提出我的查询。
TestSet.main
答案 0 :(得分:2)
你的equals方法中有一个拼写错误:你正在将一个元素的x
与另一个元素y
进行比较。这几乎没有意义;你应该比较两个x和两个y。
您应该将equals
实现为
return o instanceof TestCase
&& ((TestCase) o).getXValue() == getXValue()
&& ((TestCase) o).getYValue() == getYValue();
第二个.add(tc2)
返回false
的原因是因为HashSet
的实现使用==
检查作为优化,并且碰巧遇到了这种特殊情况。这并不会改变.equals
方法的破坏程度。
答案 1 :(得分:0)
equals
和hashCode
必须符合的规则是:如果两个对象相等,则它们的哈希码必须相同。
请注意,不意味着相反:如果两个对象具有相同的哈希码,则不一定意味着对象相等。
您的代码违反了此规则,因此当您将这两个对象放在HashSet
中时,会得到不可预测的结果。
答案 2 :(得分:0)
首先,您最好完全修复或删除您的equals方法。你的情况与hashCode方法的工作方式无关,我将在下面解释它是如何工作的:
// Set is looking for tc2 and finds object with same ref, because of previous set.add(tc2);
System.out.println(set.add(tc2));//fails and gives us false.
// You create new object with new reference.
tc2 = new TestCase(4, 8);
// Yes, because you changed tc2 variable and assigned new reference to it.
System.out.println(set.add(tc2));//succeeds and gives us true?