如何在迭代时向列表添加值

时间:2014-05-15 09:45:05

标签: java concurrentmodification

我有这样的场景

List<String> xxx = new ArrayList
for(String yyy : xxx){
   for(String zzz:xyxy){
     if(!zzz.equals(yyy)){
       xxx.add(zzz);
     }
   }
}

但我得到java.util.ConcurrentModificationException:null exception.Can任何人都可以帮我解决这个问题。任何人都可以给我替代方法来执行此操作吗?

5 个答案:

答案 0 :(得分:5)

查看ArrayList API

  

此类的iterator和listIterator方法返回的迭代器是快速失败的:如果在创建迭代器之后的任何时候对列表进行结构修改,除非通过迭代器自己的删除或者添加方法,迭代器将抛出一个ConcurrentModificationException。

因此,您需要明确获取ListIterator并使用它来正确更改ArrayList。另外,我不相信你可以使用for-each循环,因为它们中的迭代器与显式检索的迭代器是分开的。我认为你必须使用while循环:

List<String> xxx = new ArrayList<>();
ListIterator<String> iterator = xxx.listIterator();
while (iterator.hasNext()) {
    String s = iterator.next();
    for (String zzz : xyxy) {
        if (!zzz.equals(s)) {
            iterator.add(zzz); //<-- Adding is done through the iterator
        }
    }
}

答案 1 :(得分:0)

将它们添加到另一个列表中,然后将该列表添加到xxx;

List<String> xxx = new ArrayList<>();
List<String> additional = new ArrayList<>();
for (String yyy : xxx) {
    for (String zzz : xyxy) {
        if (!zzz.equals(yyy)) {
            additional.add(zzz);
        }
    }
}
xxx.addAll(additional);

答案 2 :(得分:0)

不要使用foreach循环,但使用正常的循环,如:

int originalSize=xxx.size();
for (int i=0;i<originalSize;i++) {
    xxx.add("New string appended at the end");
}

这允许您在开始迭代之前列出列表中的项目,如果列表上的唯一操作是添加一些最后的新项目。

答案 3 :(得分:0)

这意味着您无法同时访问和修改您的收藏(列表)。为此,您必须使用迭代器。我不明白你的代码中xyxy是什么。但元素的可能迭代和广告可能看起来像这样。

        List<String> xxx = new ArrayList<String>();

        xxx.add("hello");
        xxx.add("hi");
        xxx.add("hh");

        ListIterator<String> it = xxx.listIterator();
        while (it.hasNext()) {

            if (!it.next().equals("hi")) {
                it.remove();
                it.add("hi");

            }
        }

        System.out.println(xxx);
          }
      }

答案 4 :(得分:0)

要在迭代时修改列表,您可以将arraylist声明为&#34; java.util.concurrent.CopyOnWriteArrayList &#34;

public static void main(String[] args) {
    List<String> xxx = new CopyOnWriteArrayList();
    xxx.add("3");
    xxx.add("4");

    List<String> xyxy = new ArrayList();
    xyxy.add("1");
    xyxy.add("2");
    xyxy.add("3");

    for (String yyy : xxx) {
        for (String zzz : xyxy) {
            if (!zzz.equals(yyy)) {
                xxx.add(zzz);
            }
        }
    }

    System.out.println(xxx);
}