繁体   English   中英

迭代此集合时如何避免ConcurrentModificationException?

[英]How to avoid ConcurrentModificationException while iterating this collection?

我需要迭代一组项目,有时同时添加到该集合。 但是,如果我在迭代时添加,那么我只是通过打破迭代循环并从头开始重新启动迭代来重新开始迭代。 但是这会导致ConcurrentModificationException [下面的代码]

    List<Integer> collection = new ArrayList<>();
    for (Integer lobId: collection) {
         ..
         if (someCondition) {
             collection.add(something); 
             break; 
         }
    }

我怎么能做上面这样的事情来避免ConcurrentModificationException

简单地使用Array而不是ArrayList来避免这种异常是否正确? 这有什么类型的专门收藏吗?

-

编辑:

我不想为这个arraylist创建一个新副本,因为除非完成某些要求,否则我会多次重复整个迭代过程。 每次创建一个新副本会带来一些额外的开销,如果可能的话,我想避免。

如果可能的话,我想在该集合中维护一个排序顺序和唯一值。 有没有可以在任何图书馆使用的东西? 否则我可以在迭代过程结束时对其进行排序并删除重复项。 这对我也没问题。

使用另一个集合添加,并在最后组合它们。

List<Integer> collection = new ArrayList<>();
collection.add(...)
...
List<Integer> tempCollection = new ArrayList<>();    
for (Integer lobId: collection ) {
     ..
     if (someCondition) {
         tempCollection.add(something); 
         break; 
     }
}

collection.addAll(tempCollection);

这段代码不能导致ConcurrentModificationException,因为在你添加一个元素之后你就破坏了循环并且不再使用迭代器了

ConcurrentModificationException基本上意味着您使用一个iterator迭代一个Collection (尽管由增强的for循环隐式定义),并通过更改Collection本身来动态地使其无效。 您可以通过相同的iterator进行修改来避免这种情况:

List<Integer> collection = new ArrayList<>();
ListIterator<Integer> iter = collection.listIterator();
while (iter.hasNext()) {
     Integer currVal = iter.next();
     if (someCondition) {
         iter.add(something); // Note the addition is done on iter
         break; 
     }
}

如果我理解你正确,你想迭代列表,如果有一些条件,你想打破迭代,一个项目并开始新鲜。

在这种情况下这样做:

   List<Integer> collection = new ArrayList<>();
   boolean flag = false;
   Integer item = 
    for (Integer lobId: collection) {
         ..
         if (someCondition) {
             flag = true;
             item = something; 
             break; 
         }
    }

   if (flag){
      collection.add(item);
   }

如果其他人要在外面循环更改列表 - 你将需要同步这些访问 - 读取迭代器线程安全 ,并在这里使用其他答案,如复制列表或写入其他一些副本

不要每个使用,使用好旧

for(int i=0; i<collection.size();i++)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM