我正在使用Iteratot迭代ArrayList的元素。在迭代的同时,我还在最后将一个元素添加到ArrayList中。但是出现错误:ConcurrentModificationException。

如果我将ArrayList更改为Set并尝试在迭代过程的最后添加set中的元素,则不会引发任何错误

Test.java

class Test {
  public static void main() {
    ArrayList<Integer> al = new ArrayList<Integer>();
    al.add(20);
    al.add(30);
    al.add(40);

    Iterator<Integer> it = marks.iterator();
    while (it.hasNext()) {
      int value = it.next();
      if (value == 40) al.add(50);
    }
  }
}


Test2.java

class Test2 {
  public static void main() {
    Set<Integer> marks = new HashSet<>();
    marks.add(20);
    marks.add(30);
    marks.add(40);

    Iterator<Integer> it = marks.iterator();
    while (it.hasNext()) {
      int value = it.next();
      if (value == 40) marks.add(50);
    }
  }
}

最佳答案

可能有一个更好的解决方案,但是这个也很好。循环完成后,使用第二个列表,然后将其添加到原始列表中。

主要

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Main {

    public static void main(String[] args) {
        List<Integer> al = new ArrayList<Integer>();
        List<Integer> toAdd = new ArrayList<Integer>();
        int stepSize = 10;

        al.add(20);
        al.add(30);
        al.add(40);

        Iterator<Integer> it = al.iterator();
        while (it.hasNext()) {
            int value = it.next();
            if (value == al.get(al.size() - 1)){
                toAdd.add(value + stepSize);
            }
        }

        // Add all elements
        al.addAll(toAdd);

        // Print
        al.forEach(System.out::println);
    }
}


如果您只想根据最后一个值附加一个元素,例如在您的示例中,您还可以等到循环完成(如果仍然需要),然后尝试像这样添加它:

al.add(al.get(al.size() - 1) + stepSize);


输出量

20
30
40
50

10-08 02:49