Java中不可修改的集合相等

dav*_*vis 7 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));
}
Run Code Online (Sandbox Code Playgroud)

hzp*_*zpz 7

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

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

返回的集合并没有将hashCode并传递给底层集合等于操作,但依靠ObjectequalshashCode方法.在后备集合是集合或列表的情况下,这对于保留这些操作的合同是必要的.

看到这个答案是为了解释为什么其他任何东西会违反Lists和Sets 的合同.