0

I have the ViewPartner class

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;
        }
    }
}

and the ViewPartnerContainer class which contains the following method:

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;
    }
}

Now I have the following code:

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

Why is there the difference between the contains method?

St.Antario
  • 26,175
  • 41
  • 130
  • 318

1 Answers1

2

HashSet<ViewPartner> cannot work correctly because ViewPartner does not implement hashCode(). Read Object.equals API: it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes.

Evgeniy Dorofeev
  • 133,369
  • 30
  • 199
  • 275