簡體   English   中英

為什么AbstractCollection沒有實現equals()?

[英]Why AbstractCollection does not implement equals()?

你知道嗎 :

Map<Object,Object> m1 = new HashMap<Object, Object>();
Map<Object,Object> m2 = new HashMap<Object, Object>();
System.out.println("m1.equals(m2) = "+m1.equals(m2));
System.out.println("m1.keySet().equals(m2.keySet()) = "
            +m1.keySet().equals(m2.keySet()));
System.out.println("m1.entrySet().equals(m2.entrySet()) = "
            +m1.entrySet().equals(m2.entrySet()));
System.out.println("m1.values().equals(m2.values()) = "
            +m1.values().equals(m2.values()));

輸出:

m1.equals(m2) = true
m1.keySet().equals(m2.keySet()) = true
m1.entrySet().equals(m2.entrySet()) = true
m1.values().equals(m2.values()) = false

這是因為AbstractCollectionHashMap$Values繼承自)不會覆蓋#equals()

你知道為什么會這樣嗎?

每合同Collection#equals() ,沒有通用的等於()方法Collection以及由此導致的AbstractCollection不能提供的。

請注意, HashMap$Values既不是Set也不是List,因此是窘境,從某種意義上說它不支持equals()

AbstractList和AbstractSet都擴展了AbstractCollection,它們的equals()方法具有不同的行為,由接口ListSet指定。 Collection的界面說:

雖然Collection接口沒有為Object.equals的一般合同添加任何規定,但是“直接”實現Collection接口的程序員(換句話說,創建一個Collection是集合但不是Set或List的類)必須小心如果他們選擇覆蓋Object.equals。

所以AbstractCollection絕對不應該重寫equals()。 也就是說,我真的不知道為什么HashMap $ Values不會實現equals()本身。

我不確定這是否是官方原因,但AbstractCollection避免在潛在的子類上添加語義約束。 等式的語義由具體的繼承數據結構的性質決定,特別是基於您的結構是否有序以及是否允許重復。

例如,考慮TreeSet,LinkedList,Bag等。

順便說一下,關於您發布的代碼,值返回的實際類型是什么? 這應該是具有具體實現的子類。如果在運行此代碼時映射為空,則可能最終會出現不考慮兩個空集相等的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM