【问题标题】:Collection's and List's contains method [duplicate]集合和列表的包含方法[重复]
【发布时间】:2015-03-23 21:40:03
【问题描述】:

我有 ViewPartner

public class ViewPartner {
    private int id;
    private boolean enabled;

    public ViewPartner(int id, boolean enabled) {
        this.id = id;
        this.enabled = enabled;
    }

    @Override
    public boolean equals(Object o){
        if(o instanceof ViewPartner){
            return id == ((ViewPartner) o).id;
        } else {
            return false;
        }
    }
}

以及包含以下方法的ViewPartnerContainer 类:

public class SelectedViewPartnerContainer {
    private Map<Integer, List<ViewPartner>> cahcedPagePartnersMap;
    private Set<ViewPartner> rawPartners;

    //GET, SET ,Contructor and other methods

    public Collection<ViewPartner> getRawPartners(Set<ViewPartner> partners){
        for(ViewPartner vp : partners){
            if(rawPartners.contains(vp)){
                partners.add(vp);
            }
        }
        return partners;
    }
}

现在我有以下代码:

SelectedViewPartnerContainer c = new SelectedViewPartnerContainer();
Set<ViewPartner> partners = new HashSet<ViewPartner>();
List<ViewPartner> rawLst = new ArrayList<ViewPartner>();
for(int i = 40; i < 50; i++){
    rawLst.add(new ViewPartner(i, false));
}
for(int i = 37; i < 42; i++){
    partners.add(new ViewPartner(i, true));
}
//adding rawLst to the c's rawPartners property
ViewPartner p2 = new ViewPartner(40, false);
Collection<ViewPartner> co = c.getRawPartners(partners);
List<ViewPartner> co2 = new ArrayList(c.getRawPartners(partners));
co.contains(p2); //false
co2.contains(p2); //true

为什么与 contains 方法有区别?

【问题讨论】:

  • 你的equals方法违反了它和hashCode方法之间的约定
  • @MadProgrammer hashCode 方法与等于和包含有什么关系?
  • 有一个合同要求,equals 和 hashCode 应该为对象返回相同的值(所以如果两个对象相等,它们将具有相同的 hashCode)

标签: java collections


【解决方案1】:

HashSet&lt;ViewPartner&gt; 无法正常工作,因为 ViewPartner 没有实现 hashCode()。阅读 Object.equals API:通常需要在任何时候重写 hashCode 方法,以维护 hashCode 方法的一般约定,即相等的对象必须具有相等的哈希码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 2014-09-17
    • 2012-08-24
    • 2016-04-06
    • 2012-11-30
    • 2020-06-17
    相关资源
    最近更新 更多