Невозможно удалить или найти объект в Java CopyOnWriteArraySet

Я использую 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 и экземпляра внутри набора, и они оба равны.

6
задан Timo 8 June 2011 в 14:15
поделиться