ConcurrentModificationException和HashSet.iterator()

时间:2012-09-24 09:49:00

标签: java iterator concurrentmodification

我有像

这样的for循环
      for (int neighbour : neighbours) {

我可以在循环中修改neighbours。发现这就是ConcurrentModificationException的原因。并阅读https://stackoverflow.com/a/8189527/292291

  

因此,如果您想修改列表(或一般的任何集合),   使用迭代器,因为它知道修改因此   这些将得到妥善处理。

所以我试过了:

neighboursItr = neighbours.iterator();
while (neighboursItr.hasNext()) {
  // try disconnecting vertices
  neighbour = neighboursItr.next();

但这并不能解决问题。为什么呢?

4 个答案:

答案 0 :(得分:8)

你打电话给neightbours.remove(neighbour)吗?在那种情况下,这就是问题所在。您需要拨打neightboursItr.remove()

答案 1 :(得分:1)

您是否考虑过创建具有所需状态的新HashSet?我的意思是你可以遍历neighbours并添加到newNeighbours你想要的任何内容。

答案 2 :(得分:1)

您只能在迭代集合时修改集合使用迭代器的方法。因此,您可以致电neighboursItr.remove(),但例如,您可能无法使用neighbours.add()向集合中添加元素。

答案 3 :(得分:1)

迭代时无法修改集合。唯一的例外是使用iterator.remove()方法(如果目标集合支持它)。

原因是这就是迭代器的工作原理。它必须知道如何跳转到集合的下一个元素。如果在创建迭代器后更改集合,则无法执行此操作并抛出异常。

这个问题有几种解决方案。例如,如果要在迭代期间向现有集合添加元素,则可以创建另一个集合,在该集合中存储新元素,然后在迭代完成后添加所有这些元素。