问题 hashCode和equals for Collections.unmodifiableCollection()


Collections class有许多静态辅助方法,可以提供各种集合类型的只读视图,例如 unmodifiableSet()unmodifiableList()等等。对于这些视图对象, hashCode() 和 equals() 方法转发对底层集合的调用...有一个奇怪的例外: unmodifiableCollection()

JavaDoc 明确说明

返回的集合确实如此  将hashCode和equals操作传递给后台集合,但依赖于 Objectequals 和 hashCode 方法。在后备集合是集合或列表的情况下,这对于保留这些操作的合同是必要的。

我的问题:wtf是这个在谈论?如果支持集合是一个集合或列表,我希望行为符合 unmodifiableSet() 和 unmodifiableList()。怎么会违反hashCode / equals合同?


3764
2017-10-12 02:03


起源



答案:


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


14
2017-10-12 02:41