迭代时修改集合(Java)

时间:2013-08-03 11:40:33

标签: java performance iterator set

我在Java中遇到了Sets / Iterators的问题。我正在执行迭代哈希集中的元素的代码,在使用它们之后删除它们,但也删除那些被认为不必在循环内迭代的元素。我也在循环中添加元素。这是一个代码示例:

Set<Integer> thisSet = new HashSet<Integer>();
// add elements into set
while (!thisSet.isEmpty()) {
   int value = thisSet.iterator().next();
   thisSet.remove(value);
   // more remove and add operations
}

我选择了哈希集,因为我认为循环期间的删除操作比使用列表时快得多。问题是统计数据告诉我,如果集合变大,从集合中轮询一个值实际上会花费很多时间(我假设每次都创建一个迭代器?)。有没有人有关于如何改善这个的建议?

谢谢!

2 个答案:

答案 0 :(得分:0)

您可以找到有关集合性能测量的文章:http://www.artima.com/weblogs/viewpost.jsp?thread=122295(Bruce Eckel的最终性能测试示例)

http://java.dzone.com/articles/java-collection-performance(Java Collection Performance)

也许它可以帮助您为实施选择合适的集合。​​

答案 1 :(得分:0)

没有足够的声誉为Hovercraft Full Of Eels添加评论,但他绝对正确。在不使用迭代器的情况下从集合中删除项目最终会以某种方式导致ConcurrentModificationException。 1

如果我们从数据结构的角度来看这个问题,您需要一个由链接列表备份的数据结构,以便更快地插入/删除。有关插入/删除O()边界,请参阅链接列表与动态数组@ https://en.wikipedia.org/wiki/Linked_list

最终,我的建议是通过LinkedHashSet对象备份您的Set,并使用分析器检查您将要使用的示例输入的执行时间。

相关问题