13

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

JavaDoc明确指出

返回的集合不会hashCode 和 equals 操作传递给支持集合,而是依赖于Object'sequalshashCode方法。在支持集合是集合或列表的情况下,这对于保留这些操作的合同是必要的。

我的问题:这是在说什么?如果支持集合是集合或列表,我希望行为与unmodifiableSet()and一致unmodifiableList()。这将如何违反 hashCode/equals 合约?

4

1 回答 1

16

来自 JavaDoc for Collection:

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

AnUnmodifiableList是 an UnmodifiableCollection,但反过来也不一样——UnmodifiableCollection包裹 aList的an不是an UnmodifiableList。因此,如果将UnmodifiableCollection包装 Lista的 anUnmodifiableList与包装相同 List的 an 进行比较a,则两个包装器不应该相等。如果您只是通过包装列表,它们将是平等的。

于 2012-10-12T02:41:51.423 回答