【发布时间】:2016-01-06 00:04:35
【问题描述】:
我今天早上遇到了这种现象,Set 中的 equals 方法不会检查元素的值相等性,而 List 会。这不符合 java doc。
Set<MyClass> s1 = new HashSet<>();
Set<MyClass> s2 = new HashSet<>();
Set<MyClass> s3 = new HashSet<>();
Set<MyClass> s4 = new HashSet<>();
List<MyClass> l1 = new ArrayList<>();
List<MyClass> l2 = new ArrayList<>();
MyClass o1 = new MyClass();
MyClass o2 = new MyClass();
// **this gives false, and does not call MyClass.equals().**
s1.add(o1);
s2.add(o2);
boolean setCompareWithDifferentObjects = s1.equals(s2);
// this gives true, and also does not call MyClass.equals().
s3.add(o1);
s4.add(o1);
boolean setCompareWithSaveObjects = s3.equals(s4);
// this give true, and MyClass.equals() is called.
l1.add(o1);
l2.add(o2);
boolean listCompare = l1.equals(l2)
我做了一些研究。根据这个 Java doc for Set、HashSet equals、HashSet containsAll、HashSet contains,它将使用 (o==null ? e==null : o.equals(e)) 来检查元素是否相等。那么为什么会这样呢?谁能给我一些提示?
谢谢!
---------这个问题的答案可以在这里找到-----------
What issues should be considered when overriding equals and hashCode in Java?
我覆盖了 equals() 但没有覆盖 hashCode()...
顺便说一句,即使 hashCode() 没有被覆盖,相同的集合比较也可以在 groovy 中使用。
【问题讨论】:
-
你是否正确实现了equals和hashcode方法?
-
我实现了 MyClass.equals() 但没有实现 hashCode()。但是在第一次比较中,MyClass.equals 根本没有输入,即使 == 失败。
-
叹息......如果你还没有实现
hashCode(),这解释了你所看到的一切。equals()和hashCode()必须彼此一致。另外,请不要在 SO 输入文本框中重新输入代码。始终复制/粘贴,以免引入转录错误 (l2.add(l2))。一个这样明显的错误会使您的整个代码示例受到怀疑,并导致不必要的澄清请求。
标签: java list set equals hashset