ArrayList vs HashMap - много итераций и манипулирование объектами
По сути, у меня есть некоторая структура данных из множества объектов, и эта структура будет доступна нескольким потокам и должна будет учитывать это.
Многие итерации и манипуляции с объектами должны выполняться постоянно (каждая итерация основного цикла может привести к тому, что каждый отдельный объект в структуре данных будет изменен в худшем случае, а в лучшем / нормальном случае ничего не будет изменено).
В настоящее время я использую CopyOnWriteArrayList
как моя структура. Кроме того, на каждой итерации я стараюсь не добавлять дубликаты, чтобы уменьшить размер списка.
Использование блокировок / синхронизированных не идеально, так как я хочу избежать задержек потоков для этих операций.
Насколько я могу судить, мои варианты для этого следующие:
- Запустить
contains()
проверить каждый элемент, который будет добавлен - Создать
HashSet
из списка и преобразовать его обратно (по существу, удалив все дубликаты) - Использовать
ConcurrentHashMap
вместо списка для структуры данных - Что-то другое?
Я знаю что ArrayLists
намного лучше с итерацией, в то время как манипулирование объектами и проверка дубликатов лучше обрабатываются строго при использовании HashMap
, Поскольку моему делу понадобятся оба варианта, мне интересно, какое лучшее решение здесь.
Я должен также упомянуть, что упорядочение элементов не является проблемой.
Редактировать: чтобы прояснить это далее, коллекция будет иметь элементы, постоянно добавляемые, удаляемые и модифицируемые. В какой степени это зависит от каждого конкретного времени выполнения (на основе, как правило, случайных событий), поэтому я осторожно делаю предположения о том, как часто это будет происходить. Единственное, что гарантированно произойдет, это то, что коллекция будет повторяться полностью каждый раз, выполняя несколько проверок для каждого элемента.
1 ответ
Этот ответ решает ваши проблемы параллелизма:
Многие итерации и манипуляции с объектами должны выполняться постоянно (каждая итерация основного цикла может привести к тому, что каждый отдельный объект в структуре данных будет изменен в худшем случае, а в лучшем / нормальном случае ничего не будет изменено).
Будет ли изменена коллекция? Если нет, просто выберите, какая коллекция имеет смысл, и синхронизируйте объекты. Как только они попадают в коллекцию, вы не получаете никаких преимуществ от синхронизации CopyOnWriteArraylist
или же ConcurrentHashMap
,
Если коллекция будет изменена, то как часто?
Если много, не используйте CopyOnWriteArrayList. Если немного, то выбирайте на основе максимальной эффективности поиска.