直接来自这个API即Collections.synchronizedCollection(Collection)
:
返回的集合不会将 hashCode 和 equals 操作传递给支持集合,而是依赖于 Object 的 equals 和 hashCode 方法。在支持集合是集合或列表的情况下,这对于保留这些操作的合同是必要的。
这是否意味着如果我有我的覆盖方法equals
和hashCode
,那些被覆盖的方法将不会被考虑?如果是,为什么?这是相当误导...
直接来自这个API即Collections.synchronizedCollection(Collection)
:
返回的集合不会将 hashCode 和 equals 操作传递给支持集合,而是依赖于 Object 的 equals 和 hashCode 方法。在支持集合是集合或列表的情况下,这对于保留这些操作的合同是必要的。
这是否意味着如果我有我的覆盖方法equals
和hashCode
,那些被覆盖的方法将不会被考虑?如果是,为什么?这是相当误导...
假设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。
对,那是正确的。它使用equals
和hashCode
方法,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
计算)。您可以这样想:如果两个集合具有相同的元素(排序无关紧要),则两个集合相等,而如果两个列表具有完全相同的元素集合且顺序相同,则两个列表相等。