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