hashCode and equals for Collections.unmodifiableCollection()

2022-09-04 20:43:20

该类具有许多静态帮助器方法,用于提供各种集合类型的只读视图,例如 、 等。对于这些视图对象,和 方法将调用转发到基础集合...除了一个奇怪的例外:.CollectionsunmodifiableSet()unmodifiableList()hashCode()equals()unmodifiableCollection()

JavaDoc 明确指出

返回的集合传递哈希码,而是将相等的操作传递到支持集合,而是依赖于 和 方法。这对于在后备集合是集合或列表的情况下保留这些操作的协定是必要的。ObjectequalshashCode

我的问题:wtf这是在谈论吗??如果支持集合是一个集合或一个列表,我希望行为与 和 一致。这将如何违反哈希码/平等合约?unmodifiableSet()unmodifiableList()


答案 1

来自 JavaDoc for Collection:

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

An 是一个 ,但在反向操作中也是如此 -- 一个包装 a 不是 .因此,如果将包装列表的 a 与包装相同列表的 a 进行比较,则两个包装器不应相等。如果您刚刚传递到包装列表,则它们将相等。UnmodifiableListUnmodifiableCollectionUnmodifiableCollectionListUnmodifiableListUnmodifiableCollectionaUnmodifiableLista


答案 2