Collections.unmodifiableCollection如何使用equals方法?

时间:2019-02-08 04:05:32

标签: java collections

  

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}}方法上,那该如何验证本书所描述的观点呢?

1 个答案:

答案 0 :(得分:4)

您从Collections.unmodifiableCollection()的文档中摘录的内容与其返回的equals()对象的Collection方法有关,如

immutableColl.equals(anotherColl)

这与集合的contains()方法无关,该方法遵循Collection.contains()的约定,就像它应该这样做:

  

仅当此集合包含至少一个元素(o==null ? e==null : o.equals(e))时返回true。

这正是您报告的观察结果。还要注意,尽管ListSet合同规定了实现的equals()方法应如何表现的细节,但Collections.equals()的合同明确拒绝覆盖{{ 1}}。