hashCode和equals for Collections.unmodifiableCollection()

时间:2012-10-12 02:03:08

标签: java collections unmodifiable

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

JavaDoc explicitly states

  

返回的集合传递hashCode并将操作等同于支持集合,但依赖于Object的{​​{1}}和equals方法。在后备集合是集合或列表的情况下,这对于保留这些操作的合同是必要的。

我的问题:wtf是这样说的?如果支持集合是集合或列表,我希望行为与hashCodeunmodifiableSet()一致。怎么会违反hashCode / equals合约?

1 个答案:

答案 0 :(得分:15)

来自JavaDoc for Collection:

  

Object.equals方法的常规协定声明等于   必须是对称的(换句话说,a.equals(b)当且仅当   b.equals的(a))。 List.equals和Set.equals的合同说明了这一点   列表仅等于其他列表,并设置为其他集。因此,一个   自定义等于不实现的集合类的方法   当此集合时,List和Set接口必须返回false   与任何列表或集合相比。 (按照同样的逻辑,不可能   编写一个正确实现Set和List的类   接口。)

UnmodifiableListUnmodifiableCollection,但反之则相反 - 包裹UnmodifiableCollection的{​​{1}} List。因此,如果您将包含列表UnmodifiableList的{​​{1}}与包装相同列表UnmodifiableCollection的{​​{1}}进行比较,则两个包装器不应相等。如果你刚刚进入包装列表,它们将是平等的。