Java中不可修改的集合相等

时间:2015-07-30 20:35:21

标签: java collections equals

为什么以下测试在Java中失败?

@Test
public void testUnmodifiableCollection() {
    Collection<String> strList = new ArrayList<String>();
    strList.add("foo1");
    strList.add("foo2");
    Collection<String> col1 = Collections.unmodifiableCollection(strList);
    Collection<String> col2 = Collections.unmodifiableCollection(strList);
    Assert.assertTrue(col1.equals(col2));
}

1 个答案:

答案 0 :(得分:6)

因为对Collections.unmodifiableCollection(Collection)的调用返回UnmodifiableCollection,它没有实现自己的equals方法,只实现了Collection接口。因此,使用Object.equals(Object)将对象引用相互比较。由于您要比较两个不同的引用,结果是错误的。

Javadoc中还记录了equals(和hashCode)未传递给基础集合的事实:

  

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

有关其他任何内容违反ListSet s合同的详细解释,请参阅this answer