【问题标题】:About a blocking synchronized collection关于阻塞同步集合
【发布时间】:2013-07-19 08:55:06
【问题描述】:

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

返回的集合没有传递hashCode和equals 操作到后备集合,但依赖于 Object 的 equals 和 hashCode 方法。这是必要的,以保护 这些操作的合同在支持集合的情况下 是一个集合或一个列表。

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

【问题讨论】:

    标签: java collections concurrency


    【解决方案1】:

    假设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。

    【讨论】:

      【解决方案2】:

      是的,没错。它使用java.lang.ObjectequalshashCode 方法,因此,不会调用您为自己放入集合的类的equalshashCode 来确定两个这样的同步集合是否是是否相等。

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

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

      【讨论】:

        猜你喜欢
        • 2018-04-06
        • 1970-01-01
        • 1970-01-01
        • 2023-03-14
        • 2013-07-20
        • 2013-05-07
        • 1970-01-01
        • 2023-03-07
        相关资源
        最近更新 更多