Java:迭代一组,而set的内容正在被修改

nom*_*el7 7 java iterator set concurrentmodification data-structures

我希望迭代一个集合,但集合的内容将在迭代期间修改.我希望在创建迭代器时迭代原始集合,而不是迭代添加到集合中的任何新元素.这怎么可能?这是set的默认行为还是我该如何实现?

我能想到的一种方法是从原始集合中获取一个不会被修改的新集合,但这看起来不够优雅并且必须有更好的解决方案.

Jon*_*eet 8

如果你想确保你没有看到任何新的元素,那么拍摄快照就听起来对我来说就是正确的解决方案.有一些集合ConcurrentSkipListSet可以让你继续迭代,但是在看到新元素方面我看不到围绕迭代器行为的任何保证.

编辑:CopyOnWriteArraySet有您需要的要求,但写入是昂贵的,这听起来像是不适合你.

这是我能看到的唯一一套java.util.concurrent,这是这种收藏的自然包装.拿一份副本仍然可能更简单:)


tem*_*def 7

编辑:这个答案是针对单线程案例而设计的,因为我将OP的问题解释为避免编纂而不是避免多线程问题.我将在这里留下这个答案,以防它最终对使用单线程方法的任何人有用.

没有直接的方法来实现这一目标.但是,一个非常好的选项是有两个集合 - 主要集合,您迭代它们,以及一个辅助集合,您插入所有需要添加的新元素.然后,您可以遍历主集,然后一旦完成,就可以使用addAll将所有新元素添加到主集.

例如:

Set<T> masterSet = /* ... */

Set<T> newElems = /* ... */
for (T obj: masterSet) {
     /* ... do something to each object ... */
}

masterSet.addAll(newElems);
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!