Я использую CopyOnWriteArraySet для хранения одного экземпляра настраиваемого класса, который выглядит следующим образом:
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;
}
}
Когда я распечатываю набор, все выглядит нормально:
MyClass theObject = new MyClass("Object 1");
CopyOnWriteArraySet<MyClass> theSet = new CopyOnWriteArraySet();
theSet.add(theObject);
for (MyClass tmp : theSet){
System.out.println(tmp.toString());
}
Результат:
Объект 1
Итак, очевидно, что объект находится в наборе.
Теперь я хочу удалить объект из набора:
theSet.remove(theObject);
Затем я снова распечатываю содержимое набора. Результат:
Объект 1
Очень странно. Итак, я попробовал следующее:
System.out.println(String.valueOf(theSet.contains(theObject)));
Результат:
false
Очевидно, набор не может найти theObject
, хотя он есть.
Итак, я подумал, что-то не так с методом equals ()
.
Таким образом, я изменил переопределения метода equals ()
и hashCode ()
, добавив вывод консоли в первую строку каждой функции:
@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);
}
Затем я снова вызываю:
theSet.remove(theObject);
Результат:
hashCode () вызывается
Итак, метод equals ()
вообще не вызывается?
Может кто-нибудь объяснить, что там происходит?
I уже пытался сравнить хэш-коды theObject
и экземпляра внутри набора, и они оба равны.