是否有对象的哈希码的内部映射到我们在类中覆盖的内容

时间:2016-05-05 19:07:05

标签: java

设置关注唯一性,因此在我们的程序中实现set时,我们必须覆盖serf java.lang.Objectequals()方法,这样我们才能得到重复项。引用在JVM的单个和当前实例的上下文中保持其有效性,记住这一点我试图以这种方式编写我的程序。在hashCode()内(第4-6行)。我试图通过在这些行中使用注释以实用的方式提出我的查询。

TestSet.main

3 个答案:

答案 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)

equalshashCode必须符合的规则是:如果两个对象相等,则它们的哈希码必须相同。

请注意,意味着相反:如果两个对象具有相同的哈希码,则不一定意味着对象相等。

您的代码违反了此规则,因此当您将这两个对象放在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?