记录一下
使用迭代器进行遍历时不能进行元素的任何修改
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,他如果是遍历的是集合,那么就相当于还是在使用迭代器进行遍历,不能在遍历时修改元素
但是如果遍历的是数组,那么是根据索引进行遍历的