首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Collections.unmodifiableCollection是如何使用相等方法的?

Collections.unmodifiableCollection是如何使用相等方法的?
EN

Stack Overflow用户
提问于 2019-02-08 04:05:32
回答 1查看 260关注 0票数 1

unmodifiableCollection方法(以及本节后面讨论的thesynchronizedCollection和checkedCollectionmethods )返回的集合不调用基础集合的相等方法。相反,它继承了Object类的equals方法,后者只是测试对象是否相同。如果将集合或列表仅转换为集合,则无法再测试相同的内容。视图以这种方式工作,因为在层次结构的这个级别上没有很好地定义等式测试。视图在相同的hashCode中处理way.However方法,unmodifiableSet和unmodifiableList方法使用基础集合的相等方法和hashCode方法。

这个片段来自于图书核心java,然后我编写了一些代码来验证它:

代码语言:javascript
复制
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;
    }

}

运行代码,结果是:

代码语言:javascript
复制
false
true
true
true

所以我可以看到e1==e2是假的,但是imutableColl.contains(e2)是真的

如果imutableColl在调用contains方法时检查内存位置而不是内容,那么imutableColl.contains(e2)应该是false,为什么是true?

如果问题在contains方法上,那么如何验证书中描述的要点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-08 04:23:21

您从Collections.unmodifiableCollection()文档中提供的摘录是关于它返回的Collection对象的equals()方法的,如

代码语言:javascript
复制
immutableColl.equals(anotherColl)

这与集合的contains()方法没有任何关系,它遵循Collection.contains()的约定,就像它应该做的那样:

返回true当且仅当此集合包含至少一个元素e,以便使(o==null ? e==null : o.equals(e))

这正是你报告的观察结果。还要注意的是,虽然ListSet契约指定了实现的equals()方法的行为细节,但是Collections.equals()的契约明确地拒绝了覆盖Object.equals()的任何要求。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54585841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档