在这种情况下使用的Java集合是什么?

时间:2011-01-31 10:43:01

标签: java multithreading performance collections

我需要在列表或集合中保存大量元素(500k左右),我需要进行高性能遍历,添加和删除。这将在多线程环境中完成,我不关心我是否在遍历开始后看到更新完成(弱一致),Java集合适合这种情况?

8 个答案:

答案 0 :(得分:3)

  

我需要持有大量的   列表中的元素(500k左右)或   我需要做高性能   遍历,添加和删除。   ...   这将在多线程中完成   环境


ConcrrentSkipListMap - 它不是List,但List语义在并发环境中实际上是无用的。 它将元素排序为树状结构,无法通过散列访问,因此您需要一些自然顺序(或通过比较器外部)

如果您只需要在队列的末尾添加/删除 - ConcurrentLinkedQueue

如果您期望中等争用,则同步集合不适用于多线程环境。它们在整个横移操作期间也需要完全锁定。我也建议不要使用ConcurrentHashMap。

最后:如果您要使用64+这样的真正的多CPU并且期望高争用并且不希望自然排序,请点击以下链接:http://sourceforge.net/projects/high-scale-lib

答案 1 :(得分:2)

答案 2 :(得分:1)

如果遍历==读取,并添加/删除==更新,我会说,通常不会为这两个操作优化单个集合。

但你最好的选择可能是HashMap

答案 3 :(得分:1)

多线程 - 所以看看j.u.concurrent。也许ConcurrentHashMap用作Set - 例如使用put(x,x)而不是add(x)。

答案 4 :(得分:1)

如果经常添加和删除,那么“链接”可能是最佳选择。这样每次添加/删除索引时都必须更新,这与ArrayList相反,例如整个Array必须“移动”。问题是你要求收藏的圣杯。

查看the Concurrent Collections可能有所帮助。

但是你说“遍历”是什么意思?

答案 5 :(得分:0)

如果您需要快速添加或删除列表中间的项目,LinkedList是一个不错的选择。要在多线程环境中使用它,您需要像这样同步它:

List l = Collections.synchronisedList(new LinkedList());

答案 6 :(得分:0)

另一方面,由于数据量大,是否可以将数据存储在数据库中?并将内存收集用作缓存。

答案 7 :(得分:-1)

是否允许重复项目?

是,Set不能使用。你可以使用SortedSet。