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 以了解为什么其他任何内容都会违反 List
和 Set
的合同。
为什么以下测试在 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
'sequals
andhashCode
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 以了解为什么其他任何内容都会违反 List
和 Set
的合同。