unmodifiableable方法(以及本节稍后讨论的synynchronizedCollection和checkedCollection方法)将返回一个集合,该集合的equals方法不会调用基础集合的equals方法。相反,它继承了Object类的equals方法,该方法仅测试对象是否相同。如果将集合或列表变成集合,则无法再测试相同的内容。该视图以这种方式起作用,因为在层次结构的此级别上没有很好地定义相等性测试。视图以相同的方式处理hashCode方法。但是,unmodifiableSet和unmodifiableList方法使用基础集合的equals和hashCode方法。
此片段来自本书的核心java,然后我编写一些代码对其进行验证:
false
true
true
true
运行代码,结果是:
e1==e2
所以我可以看到imutableColl.contains(e2)
是错误的,但contains
是真实的
如果在调用imutableColl.contains(e2)
方法时imutableColl检查内存位置而不是内容,那么contains
应该为false,为什么是真的?
如果问题出在{{1}}方法上,那该如何验证本书所描述的观点呢?
答案 0 :(得分:4)
您从Collections.unmodifiableCollection()
的文档中摘录的内容与其返回的equals()
对象的Collection
方法有关,如
immutableColl.equals(anotherColl)
这与集合的contains()
方法无关,该方法遵循Collection.contains()
的约定,就像它应该这样做:
仅当此集合包含至少一个元素
(o==null ? e==null : o.equals(e))
时返回true。
这正是您报告的观察结果。还要注意,尽管List
和Set
合同规定了实现的equals()
方法应如何表现的细节,但Collections.equals()
的合同明确拒绝覆盖{{ 1}}。