直接来自此API即Collections.synchronizedCollection(Collection)
:
返回的集合不传递hashCode和equals 操作到支持集合,但依赖于对象 equals和hashCode方法。这是保持这一点所必需的 在支持集合的情况下这些操作的合同 是一个集合或列表。
如果我的重写方法equals
和hashCode
是否意味着,那么这些被覆盖的方法是否会被考虑在内?如果是,为什么?这是误导......
答案 0 :(得分:3)
假设equals()
只是委托给了支持集合,并假设这个支持集合是ArrayList list
。
然后你会有
Collections.synchronizedCollection(list).equals(list) == true
因为它将通过委托给list.equals(list)
来实现。
但你会有
list.equals(Collections.synchronizedCollection(list)) == false
因为列表不能等于非列表的集合,Collections.synchronizedCollection(list)
不是列表。
这将严重违反Object.equals()
的合同。如果要保持相等性,请使用Collections.synchronizedList()
同步列表,使用Collections.synchronizedSet()
同步集。
答案 1 :(得分:1)
是的,这是正确的。它使用equals
的{{1}}和hashCode
方法,因此,您在集合中放置的java.lang.Object
和equals
的实现不会被调用以确定两个这样的同步集合是否相等。
您可以在此处查看hashCode
课程的代码:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Collections.java#Collections.SynchronizedCollection
这样的原因是SynchronizedCollection
不知道它正在包装的实际类型的集合,因此无法有意义地执行SynchronizedCollection
方法(或equals
计算)。您可以想象:如果两个集合都具有相同的元素(排序无关紧要),则两个集合是等于的,而如果它们具有完全相同的元素集并且顺序相同,则两个集合是相等的。