记录一下
使用迭代器进行遍历时不能进行元素的任何修改
ArrayList<String> list = new ArrayList<>();
list.add("一");
list.add("二");
list.add("光");
list.add("华");
// 遍历器
Iterator<String> iterator = list.iterator();
// 用于存放删除的集合
ArrayList<String> list1 = new ArrayList<>();
while(iterator.hasNext()){
String next = iterator.next();
if ("二".equals(next)){
list.remove(next);
}
System.out.println(next);
}
不然就会发生并发错误
原因可以查看源码,就是点击报错处的ArrayList$Itr.checkForComodification(ArrayList.java:1095)
可以看到抛出异常处,然后可知在进行deBug断点的时候发现遍历集合时修改元素会引起modCunt的变化因此会抛出此异常
解决方法有两种
1》建立一个新的集合,然后将不需要的元素添加到此集合中,遍历结束后进行删除即可
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("一");
list.add("二");
list.add("光");
list.add("华");
// 遍历器
Iterator<String> iterator = list.iterator();
// 用于存放删除的集合
ArrayList<String> list1 = new ArrayList<>();
while(iterator.hasNext()){
String next = iterator.next();
if ("二".equals(next)){
list1.add(next);
}
System.out.println(next);
}
boolean b = list.removeAll(list1);
System.out.println(list);
System.out.println(list1);
2》直接进行for循环即可,使用for循环的时候可以在遍历时进行修改
for (int i = 0; i < list.size(); i++) {
String s = list.get(i);
if ("华".equals(s)){
list.remove(s);
}
System.out.println(s);
}
System.out.println(list);
最后就是
使用forearch,他如果是遍历的是集合,那么就相当于还是在使用迭代器进行遍历,不能在遍历时修改元素
但是如果遍历的是数组,那么是根据索引进行遍历的