使用foreach遍历数组中的元素,当中间对数组进行修改时,会出现并发修改异常。
因为foreach遍历数组对象期间,foreach会锁定集合中的对象.期间不能修改,并发修改异常是有底层源码iterator决定的.
public class TestArrayList {
static List<Integer> list=new ArrayList();
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
list.add(Integer.valueOf(i));
}
for (Integer i:list) {
System.out.println(list.indexOf(Integer.valueOf(i)));
list.add(Integer.valueOf(2));
list.remove(i);
}
}
}
出现异常:
0
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
at java.util.ArrayList$Itr.next(Unknown Source)
at test.TestArrayList.main(TestArrayList.java:13)
解决方法,可以使用for循环遍历数组中的元素
public class TestArrayList {
static List list=new ArrayList();
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
list.add(Integer.valueOf(i));
}
for (int j = 0; j < list.size(); j++) {
System.out.println(list.indexOf(j));
list.remove(j);
}
}
}
结果:
0
0
-1
1
-1
或者使用:
public class TestArrayList {
static List list=new ArrayList();
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
list.add(Integer.valueOf(i));
}
for (Integer i:new ArrayList<Integer>(list)) { //返回的结果使用new ArrayList进行重新封装。
System.out.println(list.indexOf(i));
list.remove(i);
}
}
}