今天早上我已经到了这种现象,Set
中的equals
方法不检查元素的值是否相等,而List
。这不符合java文档。Java HashSet.equals()为什么不检查对象是否相等?
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 SetHashSet equalsHashSet containsAllHashSet contains,它将使用(o == null?e == null:o.equals(e))来检查元素是否相等。那么为什么会这样呢?任何人都可以给我一些提示吗?
谢谢!
----------这个问题的答案可以在这里找到-----------
What issues should be considered when overriding equals and hashCode in Java?
我overrided equals()方法,但不是的hashCode ()...
btw,即使hashCode()没有被覆盖,也可以在groovy中工作。
你是否已经正确实现了equals和hashcode方法? –
我已经实现了MyClass.equals()而不是hashCode()。但在第一次比较中,即使==失败,MyClass.equals也不会被输入。 – xing
感叹......如果你还没有实现'hashCode()',这就解释了你所看到的一切。 equals()和hashCode()必须相互一致。另外,请不要将代码重新输入到SO输入文本框中。总是复制/粘贴,以免引入转录错误('l2.add(l2)')。一个这样明显的错误会使您的整个代码示例受到怀疑,并导致不必要的澄清请求。 –