赞
踩
记录一下
使用迭代器进行遍历时不能进行元素的任何修改
- 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,他如果是遍历的是集合,那么就相当于还是在使用迭代器进行遍历,不能在遍历时修改元素
但是如果遍历的是数组,那么是根据索引进行遍历的
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。