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