Ответ 1
HashSet - это правильная коллекция для моего дела. Он не будет называть equals при добавлении элементов, если не будет hashCode. Таким образом, я могу использовать методы equals для моей конкретной цели.
У меня есть классы вроде ниже
class A {
@Override
public boolean equals(Object other) { return true }
}
Class B extends A {
}
Class C extends A {
@Override
public boolean equals(Object other) { if ((other != null) || (other instanceOf B)) return false; }
}
In my main() I have this following code
Set<A> mySet = new CopyOnWriteArraySet<A>();
mySet.add(C);
I want mySet to contain C at this point
mySet.add(B); // #1
I want mySet to contain C & B at this point
mySet.remove(B); // #2
I want mySet to contain C at this point
Я хочу создать глобальную очередь, где, если объект C существует в очереди B, должен быть добавлен, но не наоборот. Поэтому перед # 1 я перебираю элементы внутри набора, делающие element.equals(B) с добавлением на false.
Но 1 вызывает B.equals(C), который возвращает true, и поэтому mySet имеет только один объект C после этой строки
2 снова вызывает B.equals(C), который возвращает true и удаляет существующий объект C. В этом случае не должно быть C.equals(B)? Я ожидаю, что эта строка будет no-action
Это неправильное использование CopyOnWriteArraySet?
Спасибо, что посмотрели
HashSet - это правильная коллекция для моего дела. Он не будет называть equals при добавлении элементов, если не будет hashCode. Таким образом, я могу использовать методы equals для моей конкретной цели.
Правильное поведение обнаруживает элемент equal()
, поэтому он удаляет первый элемент
Удаляет указанный элемент из этого набора, если он присутствует. Более формально удаляет элемент e такой, что
(o==null ? e==null : o.equals(e))
, если этот набор содержит такой элемент. Возвращает true, если этот набор содержит элемент (или, что то же самое, если этот набор изменился в результате вызова). (Этот набор не будет содержать элемент после вызова.) ...