1

直接来自这个APICollections.synchronizedCollection(Collection)

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

这是否意味着如果我有我的覆盖方法equalshashCode,那些被覆盖的方法将不会被考虑?如果是,为什么?这是相当误导...

4

2 回答 2

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()同步 List 和Collections.synchronizedSet()同步 Set。

于 2013-07-19T09:08:02.433 回答
1

对,那是正确的。它使用equalshashCode方法,java.lang.Object因此,将不会调用您放入集合中的您自己的类的实现equals和方法hashCode来确定两个这样的同步集合是否相等。

你可以在这里看到SynchronizedCollection类的代码:http: //grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Collections.java#Collections.SynchronizedCollection

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

于 2013-07-19T09:10:16.977 回答