基本上,我有一些对象的数据结构,这个结构将被多个线程访问,并且需要考虑这个结构。很多迭代和对象操作都需要不断进行(每个主循环迭代都会导致数据结构中的每个对象在最坏的情况下被修改,而在最好/正常情况下不会修改)。ArrayList vs HashMap - 大量的迭代和对象操作
目前,我正在使用CopyOnWriteArrayList
作为我的结构。此外,在每次迭代时,我都确保不添加重复项,以尝试保持列表大小。
使用锁定/ synchronized是不理想的,因为我想避免阻止这些操作的线程。
据我所知道的,是我对这个选项如下:
- 运行检查要添加
- 创建从列表中
HashSet
并将其转换回每一个元素(主要是删除所有重复项) - 使用
ConcurrentHashMap
而不是数据结构的列表 - 还有其他的东西吗?
我知道ArrayLists
与迭代要好得多,而对象的操作和重复检查更好地通过严格使用HashMap
处理。由于我的情况将需要两个,我想知道什么是最好的解决方案在这里。
我还应该提到元素的排序是一个非问题。
编辑:为了进一步说明这一点,该集合将不断添加,删除和修改元素。在多大程度上取决于每个特定的运行时间(基于一般的随机事件),所以我对有多频繁地做出任何假设都很谨慎。唯一保证发生的事情是集合将每次完全遍历,对每个元素执行多次检查。
如果您还需要快速唯一性检查,则HashMap上的迭代并不特别差。我会说整个集合的ConcurrentHashMap。 – 2014-11-21 20:20:22
如果你所需要的只是一个集合,你也可以使用'Collections.newSetFromMap(new ConcurrentHashMap <>());' - 我不确定迭代在地图vs列表上会更糟糕,这是值得检查的。 – assylias 2014-11-21 20:27:14
我在STO上看到了一些其他线程,讲述了如何通过ArrayList迭代平均迭代通过HashMap的键集的速度的3到4倍 – 2014-11-21 21:26:52