[英]hashCode and equals for Collections.unmodifiableCollection()
Collections
類有許多靜態輔助方法來提供各種集合類型的只讀視圖,例如unmodifiableSet()
, unmodifiableList()
等。對於這些視圖對象, hashCode()
和equals()
方法將調用轉發給底層集合......有一個奇怪的例外: unmodifiableCollection()
。
JavaDoc 明確指出 :
返回的集合不將hashCode並傳遞給底層集合等於操作,而是依賴於
Object
的equals
和hashCode
方法。 在后備集合是集合或列表的情況下,這對於保留這些操作的合同是必要的。
我的問題:wtf是這個在談論? 如果支持集合是集合或列表,我希望行為與unmodifiableSet()
和unmodifiableList()
。 怎么會違反hashCode / equals合約?
從JavaDoc for Collection:
Object.equals方法的一般契約聲明equals必須是對稱的(換句話說,a.equals(b)當且僅當b.equals(a))。 List.equals和Set.equals的合同表明列表僅等於其他列表,並設置為其他集合。 因此,當將此集合與任何列表或集合進行比較時,既不實現List也不實現Set接口的集合類的自定義equals方法必須返回false。 (通過相同的邏輯,不可能編寫一個正確實現Set和List接口的類。)
一個UnmodifiableList
是UnmodifiableCollection
,但相同的是不是恰好相反-一個UnmodifiableCollection
一個包裝了List
不是 UnmodifiableList
。 所以,如果你比較的UnmodifiableCollection
一個封裝了列表a
與UnmodifiableList
包裝了同一個列表a
,兩個包裝不應該是相等的。 如果你剛剛進入包裝列表,它們將是平等的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.