我正在使用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