2014-11-21 37 views
3

基本上,我有一些对象的数据结构,这个结构将被多个线程访问,并且需要考虑这个结构。很多迭代和对象操作都需要不断进行(每个主循环迭代都会导致数据结构中的每个对象在最坏的情况下被修改,而在最好/正常情况下不会修改)。ArrayList vs HashMap - 大量的迭代和对象操作

目前,我正在使用CopyOnWriteArrayList作为我的结构。此外,在每次迭代时,我都确保不添加重复项,以尝试保持列表大小。

使用锁定/ synchronized是不理想的,因为我想避免阻止这些操作的线程。

据我所知道的,是我对这个选项如下:

  1. 运行检查要添加
  2. 创建从列表中HashSet并将其转换回每一个元素(主要是删除所有重复项)
  3. 使用ConcurrentHashMap而不是数据结构的列表
  4. 还有其他的东西吗?

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

我还应该提到元素的排序是一个非问题。

编辑:为了进一步说明这一点,该集合将不断添加,删除和修改元素。在多大程度上取决于每个特定的运行时间(基于一般的随机事件),所以我对有多频繁地做出任何假设都很谨慎。唯一保证发生的事情是集合将每次完全遍历,对每个元素执行多次检查。

+0

如果您还需要快速唯一性检查,则HashMap上的迭代并不特别差。我会说整个集合的ConcurrentHashMap。 – 2014-11-21 20:20:22

+1

如果你所需要的只是一个集合,你也可以使用'Collections.newSetFromMap(new ConcurrentHashMap <>());' - 我不确定迭代在地图vs列表上会更糟糕,这是值得检查的。 – assylias 2014-11-21 20:27:14

+0

我在STO上看到了一些其他线程,讲述了如何通过ArrayList迭代平均迭代通过HashMap的键集的速度的3到4倍 – 2014-11-21 21:26:52

回答

1

这个答案解决您的并发性的担忧:

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

该集合是否会被修改?如果不是只选择哪个集合最有意义并且在对象上同步。一旦它们进入集合中,您将不会从CopyOnWriteArraylistConcurrentHashMap获得同步优势。

如果收集将被修改后续是多久?

如果很多不使用CopyOnWriteArrayList。如果有一点,然后根据最高的搜索性能选择。

+0

嗯,这并没有完全回答它,但感谢至少尝试。你会得到最好的答案。 – 2014-11-26 18:34:54