ArrayList vs HashMap - много итераций и манипулирование объектами

По сути, у меня есть некоторая структура данных из множества объектов, и эта структура будет доступна нескольким потокам и должна будет учитывать это.

Многие итерации и манипуляции с объектами должны выполняться постоянно (каждая итерация основного цикла может привести к тому, что каждый отдельный объект в структуре данных будет изменен в худшем случае, а в лучшем / нормальном случае ничего не будет изменено).

В настоящее время я использую CopyOnWriteArrayList как моя структура. Кроме того, на каждой итерации я стараюсь не добавлять дубликаты, чтобы уменьшить размер списка.

Использование блокировок / синхронизированных не идеально, так как я хочу избежать задержек потоков для этих операций.

Насколько я могу судить, мои варианты для этого следующие:

  1. Запустить contains() проверить каждый элемент, который будет добавлен
  2. Создать HashSet из списка и преобразовать его обратно (по существу, удалив все дубликаты)
  3. Использовать ConcurrentHashMap вместо списка для структуры данных
  4. Что-то другое?

Я знаю что ArrayLists намного лучше с итерацией, в то время как манипулирование объектами и проверка дубликатов лучше обрабатываются строго при использовании HashMap, Поскольку моему делу понадобятся оба варианта, мне интересно, какое лучшее решение здесь.

Я должен также упомянуть, что упорядочение элементов не является проблемой.

Редактировать: чтобы прояснить это далее, коллекция будет иметь элементы, постоянно добавляемые, удаляемые и модифицируемые. В какой степени это зависит от каждого конкретного времени выполнения (на основе, как правило, случайных событий), поэтому я осторожно делаю предположения о том, как часто это будет происходить. Единственное, что гарантированно произойдет, это то, что коллекция будет повторяться полностью каждый раз, выполняя несколько проверок для каждого элемента.

1 ответ

Решение

Этот ответ решает ваши проблемы параллелизма:

Многие итерации и манипуляции с объектами должны выполняться постоянно (каждая итерация основного цикла может привести к тому, что каждый отдельный объект в структуре данных будет изменен в худшем случае, а в лучшем / нормальном случае ничего не будет изменено).

Будет ли изменена коллекция? Если нет, просто выберите, какая коллекция имеет смысл, и синхронизируйте объекты. Как только они попадают в коллекцию, вы не получаете никаких преимуществ от синхронизации CopyOnWriteArraylist или же ConcurrentHashMap,

Если коллекция будет изменена, то как часто?

Если много, не используйте CopyOnWriteArrayList. Если немного, то выбирайте на основе максимальной эффективности поиска.

Другие вопросы по тегам