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