Java for-each 修改问题
Contents
问题
有一次在测试时,发现程序报如下类似错误:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
原因
这是因为在使用for-each
时,修改了for-each
的对象(比如调用了remove())等。问题重现:
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(100);
for (int i = 0; i < 100; i++) {
list.add(i);
}
for (Integer i : list) {
if (i % 2 == 0) {
list.remove(i);
}
}
}
一时写代码,又忘记这些基础了,归根结底,还是基础不够扎实。~~for-each
只适合于遍历,则不能删除.
解决
如果确实想要修改,可以改为for(int i=0; i<list.size(); i++)
这种形式.如:
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(100);
for (int i = 0; i < 100; i++) {
list.add(i);
}
for (int i = 0; i < list.size(); i++) {
if (i % 2 == 0) {
list.remove(i);
}
}
}
或者使用iterator.如:
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(100);
for (int i = 0; i < 100; i++) {
list.add(i);
}
Iterator<Integer> iterator = list.iterator();
while(iterator.hasNext()){
Integer i = iterator.next();
if(i%2==0){
iterator.remove();
}
}
System.out.println(list);
}