hashCode和equals for Collections.unmodifiableCollection()

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

JavaDoc 明确指出 :

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

我的问题: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 ,但反过来却不一样 – 包装ListUnmodifiableList 不是 UnmodifiableList 。 因此,如果将包装List aUnmodifiableList与包装相同List aUnmodifiableList进行比较,则两个包装器不应相等。 如果您刚刚进入包装列表,它们将是平等的。