unmodifiableCollection方法(以及本节后面讨论的thesynchronizedCollection和checkedCollectionmethods )返回的集合不调用基础集合的相等方法。相反,它继承了Object类的equals方法,后者只是测试对象是否相同。如果将集合或列表仅转换为集合,则无法再测试相同的内容。视图以这种方式工作,因为在层次结构的这个级别上没有很好地定义等式测试。视图在相同的hashCode中处理way.However方法,unmodifiableSet和unmodifiableList方法使用基础集合的相等方法和hashCode方法。
这个片段来自于图书核心java,然后我编写了一些代码来验证它:
package collection.view;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
public class ColsOf {
public static void main(String[] args) {
List<TestEqual> list1=new ArrayList<>();
TestEqual e1 = new TestEqual(5, 3);TestEqual e2 = new TestEqual(5, 3);
System.out.println(e1==e2);System.out.println(e1.equals(e2));
list1.add(e1);
List<TestEqual> imutableList = Collections.unmodifiableList(list1);
System.out.println(imutableList.contains(e2));
Collection<TestEqual> imutableColl = Collections.unmodifiableCollection(list1);
System.out.println(imutableColl.contains(e2));
}
}
class TestEqual{
int i;
int j;
@Override
public int hashCode() {
// TODO Auto-generated method stub
return i*100+j;
}
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
return this.hashCode()==obj.hashCode();
}
public TestEqual(int i, int j) {
super();
this.i = i;
this.j = j;
}
}运行代码,结果是:
false
true
true
true所以我可以看到e1==e2是假的,但是imutableColl.contains(e2)是真的
如果imutableColl在调用contains方法时检查内存位置而不是内容,那么imutableColl.contains(e2)应该是false,为什么是true?
如果问题在contains方法上,那么如何验证书中描述的要点?
发布于 2019-02-08 04:23:21
您从Collections.unmodifiableCollection()文档中提供的摘录是关于它返回的Collection对象的equals()方法的,如
immutableColl.equals(anotherColl)这与集合的contains()方法没有任何关系,它遵循Collection.contains()的约定,就像它应该做的那样:
返回true当且仅当此集合包含至少一个元素e,以便使
(o==null ? e==null : o.equals(e))。
这正是你报告的观察结果。还要注意的是,虽然List和Set契约指定了实现的equals()方法的行为细节,但是Collections.equals()的契约明确地拒绝了覆盖Object.equals()的任何要求。
https://stackoverflow.com/questions/54585841
复制相似问题