давайте предположим, что следующий класс ...
class Foo {
private Bar1 bar1;
private Bar2 bar2;
// many other fields
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Foo foo = (Foo) o;
if (!bar1.equals(foo.getBar1()) return false;
if (!bar2.equals(foo.getBar2()) return false;
// etc...
}
@Override
public int hashCode() {
int result = bar1.hashCode();
result = 31 * result + bar2.hashCode();
// etc...
}
// setters & getters follow...
}
Тысячи экземпляров Foo в минуту создаются, обрабатываются и, следовательно, перерабатываются в пуле. Рабочий процесс следующий:
Set<Foo> foos = new THashSet<>();
while (there-is-data) {
String serializedDataFromApi = api.getData();
Set<Foo> buffer = pool.deserializeAndCreate(serializedDataFromApi);
foos.addAll(buffer);
}
processor.process(foos);
pool.recycle(foos);
Проблема в том, что в разных буферах могут быть повторяющиеся объекты foo (с одинаковыми значениями). Они материализуются как разные экземпляры Foo, однако они считаются равными в момент вызова foos.addAll (buffer).
Мои вопросы:
- Что случилось с этими "дублирующими" экземплярами?
- Они "потеряны" и мусор собран?
- Если бы я хотел сохранить эти экземпляры доступными в пуле, какой был бы наиболее эффективный способ проверки на наличие дубликатов перед вставкой с использованием экземпляров addAll и утилизации?