【问题标题】:ArrayList vs HashMap — Lots of Iterating and Object ManipulationArrayList vs HashMap——大量的迭代和对象操作
【发布时间】:2015-01-20 01:59:54
【问题描述】:

基本上,我有大量对象的一些数据结构,这个结构将被多个线程访问,需要考虑到这一点。

需要不断地执行大量迭代和对象操作(每次主循环迭代都可能导致数据结构中的每个对象在最坏的情况下都被修改,而在最佳/正常情况下没有任何修改)。

目前,我使用CopyOnWriteArrayList 作为我的结构。此外,在每次迭代中,我确保不添加重复项,以尽量减小列表的大小。

使用锁/同步并不理想,因为我想避免为这些操作阻塞线程。

据我所知,我的选择如下:

  1. 运行contains() 检查每个要添加的元素
  2. 从列表中创建一个HashSet 并将其转换回来(基本上删除所有重复项)
  3. 使用ConcurrentHashMap 代替数据结构的列表
  4. 还有别的吗?

我知道ArrayLists 的迭代效果要好得多,而严格使用HashMap 可以更好地处理对象操作和重复检查。由于我的情况需要两者,我想知道这里最好的解决方案是什么。

我还应该提到元素的顺序不是问题。

编辑:为了进一步澄清这一点,该集合将不断添加、删除和修改元素。在何种程度上取决于每个特定的运行时间(基于一般随机事件),所以我对做出任何关于它发生频率的假设持谨慎态度。唯一可以保证发生的事情是每次都会对集合进行完全迭代,对每个元素执行多次检查。

【问题讨论】:

  • 如果您还需要快速唯一性检查,则 HashMap 上的迭代并不是特别糟糕。我会说整个集合的 ConcurrentHashMap。
  • 如果您只需要一个集合,您也可以使用Collections.newSetFromMap(new ConcurrentHashMap<>()); - 我不确定迭代在地图与列表上是否会更糟,这是值得检查的。
  • 我在 STO 上看到了其他几个线程,关于迭代 ArrayList 的平均速度是迭代 HashMap 键集的 3 或 4 倍

标签: java multithreading arraylist hashmap copyonwritearraylist


【解决方案1】:

这个答案解决了您的并发问题:

需要不断执行大量迭代和对象操作(每次主循环迭代都可能导致数据结构中的每个对象在最坏的情况下都被修改,而在最佳/正常情况下没有任何修改)。

集合会被修改吗?如果不只是选择最有意义的集合并在对象上同步。一旦它们在集合中,您就不会从 CopyOnWriteArraylistConcurrentHashMap 获得同步优势。

如果收藏品会被修改,跟进的频率是多少?

如果很多不使用 CopyOnWriteArrayList。如果有一点,则根据最高搜索性能进行选择。

【讨论】:

  • 好吧,这并没有完全回答它,但至少感谢您的尝试。您将获得最佳答案。
猜你喜欢
  • 2012-03-07
  • 2016-09-08
  • 2014-08-29
  • 2017-06-08
  • 1970-01-01
  • 2016-05-30
  • 2015-04-13
  • 1970-01-01
  • 2011-12-02
相关资源
最近更新 更多