Java 中不可修改的集合相等性

Unmodifiable collection equality in Java

为什么以下测试在 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));
}

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

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

The returned collection does not pass the hashCode and equals operations through to the backing collection, but relies on Object's equals and hashCode methods. This is necessary to preserve the contracts of these operations in the case that the backing collection is a set or a list.

请参阅 this answer 以了解为什么其他任何内容都会违反 ListSet 的合同。