I use CopyOnWriteArraySet to store one instance of a custom class that looks like this:
public class MyClass{ String _name; public MyClass(String name){ _name = name; } @Override public int hashCode(){ return _name.hashCode(); } @Override public boolean equals(Object obj){ if (obj == this) return true; if ((obj instanceof MyClass) == false) return false; MyClass otherObject = (MyClass) obj; return _name.equals(otherObject._name); } @Override public String toString(){ return _name; } }
When I print a set, everything looks fine:
MyClass theObject = new MyClass("Object 1"); CopyOnWriteArraySet<MyClass> theSet = new CopyOnWriteArraySet(); theSet.add(theObject); for (MyClass tmp : theSet){ System.out.println(tmp.toString()); }
Result:
Object 1
So, obviously, the object is in the set.
Now I want to remove an object from the set:
theSet.remove(theObject);
Then I print the contents of the set again. Result:
Object 1
Very strange. So, I tried this:
System.out.println(String.valueOf(theSet.contains(theObject)));
Result:
falsely
Obviously, the collection cannot find theObject , although it is. So, I thought something was wrong with the equals() method. Thus, I changed the overrides of the equals() and hashCode() method, adding console printing to the first line of each function:
@Override public int hashCode(){ System.out.println("hashCode() called"); return _name.hashCode(); } @Override public boolean equals(Object obj){ System.out.println("equals() called"); if (obj == this) return true; if ((obj instanceof MyClass) == false) return false; MyClass otherObject = (MyClass) obj; return _name.equals(otherObject.name); }
Then again I call:
theSet.remove(theObject);
Result:
hashCode () is called
So, is the equals() method not called at all?
Can someone explain what is going on there?
I already tried to compare the hash codes of theObject and the instance inside the set, and they are both equal.