2

我对 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
}

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

谢谢!

4

2 回答 2

0

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

如果我们从数据结构的角度来看这一点,您需要一个由链表支持的数据结构,以使插入/删除更快。请参阅链接列表与动态数组 @ https://en.wikipedia.org/wiki/Linked_list了解插入/删除 O() 界限。

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

于 2013-08-03T16:54:27.093 回答
0

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

http://java.dzone.com/articles/java-collection-performance(Java集合性能)

也许它会帮助您为您的实现选择正确的集合。

于 2013-08-03T13:09:59.847 回答