该 Collections
class有许多静态辅助方法,可以提供各种集合类型的只读视图,例如 unmodifiableSet()
, unmodifiableList()
等等。对于这些视图对象, hashCode()
和 equals()
方法转发对底层集合的调用...有一个奇怪的例外: unmodifiableCollection()
。
JavaDoc 明确说明:
返回的集合确实如此 不 将hashCode和equals操作传递给后台集合,但依赖于 Object
的 equals
和 hashCode
方法。在后备集合是集合或列表的情况下,这对于保留这些操作的合同是必要的。
我的问题:wtf是这个在谈论?如果支持集合是一个集合或列表,我希望行为符合 unmodifiableSet()
和 unmodifiableList()
。怎么会违反hashCode / equals合同?
从JavaDoc for Collection:
Object.equals方法的常规协定表明等于
必须是对称的(换句话说,a.equals(b)当且仅当
b.equals的(a))。 List.equals和Set.equals的合同说明了这一点
列表仅等于其他列表,并设置为其他集。因此,一个
自定义等于不实现的集合类的方法
当此集合为时,List和Set接口必须返回false
与任何列表或集合相比。 (按照同样的逻辑,不可能
编写一个正确实现Set和List的类
接口)。
一个 UnmodifiableList
是一个 UnmodifiableCollection
,但反过来也是如此 - 一个 UnmodifiableCollection
包裹一个 List
是 不 一个 UnmodifiableList
。所以,如果你比较一个 UnmodifiableCollection
包装List a
与 UnmodifiableList
包装相同的List a
,两个包装不应该相等。如果您刚刚进入包装列表,它们将是平等的。