nom*_*el7 7 java iterator set concurrentmodification data-structures
我希望迭代一个集合,但集合的内容将在迭代期间修改.我希望在创建迭代器时迭代原始集合,而不是迭代添加到集合中的任何新元素.这怎么可能?这是set的默认行为还是我该如何实现?
我能想到的一种方法是从原始集合中获取一个不会被修改的新集合,但这看起来不够优雅并且必须有更好的解决方案.
如果你想确保你没有看到任何新的元素,那么拍摄快照就听起来对我来说就是正确的解决方案.有一些集合ConcurrentSkipListSet
可以让你继续迭代,但是在看到新元素方面我看不到围绕迭代器行为的任何保证.
编辑:CopyOnWriteArraySet
有您需要的要求,但写入是昂贵的,这听起来像是不适合你.
这是我能看到的唯一一套java.util.concurrent
,这是这种收藏的自然包装.拿一份副本仍然可能更简单:)
编辑:这个答案是针对单线程案例而设计的,因为我将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)
希望这可以帮助!