hashCode和equals for Collections.unmodifiableCollection()

mer*_*ict 13 java collections unmodifiable

Collections类有很多的静态辅助方法来提供只读视图各种集合类型,例如unmodifiableSet(),unmodifiableList()等等.对于这些视图对象中,hashCode()equals()方法前调用底层集合......随着一个奇怪的例外:unmodifiableCollection().

JavaDoc 明确指出:

返回的集合并没有将hashCode并传递给底层集合等于操作,但依靠ObjectequalshashCode方法.在后备集合是集合或列表的情况下,这对于保留这些操作的合同是必要的.

我的问题:wtf是这个在谈论?如果支持集合是集合或列表,我希望行为与unmodifiableSet()和一致unmodifiableList().怎么会违反hashCode/equals合约?

Jac*_*son 16

从JavaDoc for Collection:

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

一个UnmodifiableList是一个UnmodifiableCollection,但相同的是不是恰好相反-一个UnmodifiableCollection一个包装了List不是UnmodifiableList.因此,如果将UnmodifiableCollection包装List aUnmodifiableList包装与包装相同List a的包装进行比较,那么两个包装器不应该相等.如果你刚刚进入包装列表,它们将是平等的.