关于阻塞同步集合

时间:2013-07-19 08:55:07

标签: java collections concurrency

直接来自此APICollections.synchronizedCollection(Collection)

  

返回的集合不传递hashCode和equals   操作到支持集合,但依赖于对象   equals和hashCode方法。这是保持这一点所必需的   在支持集合的情况下这些操作的合同   是一个集合或列表。

如果我的重写方法equalshashCode是否意味着,那么这些被覆盖的方法是否会被考虑在内?如果是,为什么?这是误导......

2 个答案:

答案 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.Objectequals的实现不会被调用以确定两个这样的同步集合是否相等。

您可以在此处查看hashCode课程的代码:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Collections.java#Collections.SynchronizedCollection

这样的原因是SynchronizedCollection不知道它正在包装的实际类型的集合,因此无法有意义地执行SynchronizedCollection方法(或equals计算)。您可以想象:如果两个集合都具有相同的元素(排序无关紧要),则两个集合是等于的,而如果它们具有完全相同的元素集并且顺序相同,则两个集合是相等的。