Я использую 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)));
Результат:
ложь
Очевидно, что набор не может найти 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()
вообще не вызывается?
Может кто-нибудь объяснить, что там происходит?
Я уже пытался сравнить хэш-коды theObject
и экземпляр внутри набора, и они оба равны.