簡體   English   中英

hashCode和equals for Collections.unmodifiableCollection()

[英]hashCode and equals for Collections.unmodifiableCollection()

Collections類有許多靜態輔助方法來提供各種集合類型的只讀視圖,例如unmodifiableSet()unmodifiableList()等。對於這些視圖對象, hashCode()equals()方法將調用轉發給底層集合......有一個奇怪的例外: unmodifiableCollection()

JavaDoc 明確指出

返回的集合將hashCode並傳遞給底層集合等於操作,而是依賴於ObjectequalshashCode方法。 在后備集合是集合或列表的情況下,這對於保留這些操作的合同是必要的。

我的問題: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接口的類。)

一個UnmodifiableListUnmodifiableCollection ,但相同的是不是恰好相反-一個UnmodifiableCollection一個包裝了List 不是 UnmodifiableList 所以,如果你比較的UnmodifiableCollection一個封裝了列表aUnmodifiableList包裝了同一個列表a ,兩個包裝不應該是相等的。 如果你剛剛進入包裝列表,它們將是平等的。

暫無
暫無

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

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