How does the contains-method find out if a certain object is/is not in a HashSet? I created a class with two instance variables. Then I put a few instances into a HashSet. I created the same instances again (with same instance variable values) and used them as the input for the contains-method. Although it were the same objects, "contains" returned false every time. So, I'm wondering if only the references are checked, or the values of the objects. If I have to identical objects and I put one into the HashSet and call the the "contains" method with the other object will the method return true or false? If false, what do I have to do, so that it returns true?
            Asked
            
        
        
            Active
            
        
            Viewed 3,726 times
        
    3
            
            
        - 
                    what language is that? Java? – njzk2 Aug 08 '15 at 00:28
- 
                    2The doc tells you the contract for `contains` in the specific case of the hash set. It tells you how it considers that 2 objects are the same key. – njzk2 Aug 08 '15 at 00:32
- 
                    Oh yeah, sorry. It's JAVA.. – cobby Aug 08 '15 at 00:34
- 
                    2If you store instances of your custom class in a `HashSet` (or any `Set`), make sure you correctly override the `equals` and `hashCode` methods in that class. Otherwise, two objects in the `Set` are only considered equal if they are the same object (`==`). – Mick Mnemonic Aug 08 '15 at 00:47
- 
                    1possible duplicate of [What issues should be considered when overriding equals and hashCode in Java?](http://stackoverflow.com/questions/27581/what-issues-should-be-considered-when-overriding-equals-and-hashcode-in-java) – user207421 Aug 08 '15 at 01:52
- 
                    possible duplicate of [HashSet contains() method](http://stackoverflow.com/questions/31470515/hashset-contains-method) – durron597 Aug 10 '15 at 06:11
1 Answers
4
            
            
        Whether multiple objects will match when they are identical depends on how equals() and hashCode() are implemented. For example for class A every object is the same since it has only one final field set to a constant.
public static class A {
    final int a=2;
}
But the HashSet see containing one as containing the other:
 A a1 = new A();
 HashSet<A> hsA = new HashSet<>();
 hsA.add(a1);
 A a2 = new A();
 System.out.println("hsA.contains(a2) = " + hsA.contains(a2));
Class B is the same but overrides hashCode() and equals():
public static class B {
    final int a = 2;
    @Override
    public int hashCode() {
        int hash = 5;
        hash = 17 * hash + this.a;
        return hash;
    }
    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final B other = (B) obj;
        if (this.a != other.a) {
            return false;
        }
        return true;
    }
}
Running almost the same code:
    B b1 = new B();
    HashSet<B> hsB = new HashSet<>();
    hsB.add(b1);
    B b2 = new B();
    System.out.println("hsB.contains(b2) = " + hsB.contains(b2));
produces a different value. The output is :
hsA.contains(a2) = false
hsB.contains(b2) = true
Most IDE's have an option to generate hashCode() and equals() so that whether objects match can depend on exactly the fields you specify.
 
    
    
        WillShackleford
        
- 6,918
- 2
- 17
- 33
 
    