今天早上我已經到了這種現象,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)')。一個這樣明顯的錯誤會使您的整個代碼示例受到懷疑,並導致不必要的澄清請求。 –