该 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,两个包装不应该相等。如果您刚刚进入包装列表,它们将是平等的。