为什么以下测试在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));
}
答案 0 :(得分:6)
因为对Collections.unmodifiableCollection(Collection)
的调用返回UnmodifiableCollection
,它没有实现自己的equals
方法,只实现了Collection
接口。因此,使用Object.equals(Object)
将对象引用相互比较。由于您要比较两个不同的引用,结果是错误的。
Javadoc中还记录了equals
(和hashCode
)未传递给基础集合的事实:
返回的集合不传递hashCode和equals 操作到支持集合,但依赖于
Object
equals
和hashCode
方法。这是保持这一点所必需的 在支持集合的情况下这些操作的合同 是一个集合或列表。
有关其他任何内容违反List
和Set
s合同的详细解释,请参阅this answer。