当前位置:   article > 正文

使用迭代器进行遍历时不能进行元素的任何修改

使用迭代器进行遍历时不能进行元素的任何修改

记录一下

使用迭代器进行遍历时不能进行元素的任何修改

  1. ArrayList<String> list = new ArrayList<>();
  2. list.add("一");
  3. list.add("二");
  4. list.add("光");
  5. list.add("华");
  6. // 遍历器
  7. Iterator<String> iterator = list.iterator();
  8. // 用于存放删除的集合
  9. ArrayList<String> list1 = new ArrayList<>();
  10. while(iterator.hasNext()){
  11. String next = iterator.next();
  12. if ("二".equals(next)){
  13. list.remove(next);
  14. }
  15. System.out.println(next);
  16. }

不然就会发生并发错误

原因可以查看源码,就是点击报错处的ArrayList$Itr.checkForComodification(ArrayList.java:1095)

可以看到抛出异常处,然后可知在进行deBug断点的时候发现遍历集合时修改元素会引起modCunt的变化因此会抛出此异常

解决方法有两种

1》建立一个新的集合,然后将不需要的元素添加到此集合中,遍历结束后进行删除即可

  1. public static void main(String[] args) {
  2. ArrayList<String> list = new ArrayList<>();
  3. list.add("一");
  4. list.add("二");
  5. list.add("光");
  6. list.add("华");
  7. // 遍历器
  8. Iterator<String> iterator = list.iterator();
  9. // 用于存放删除的集合
  10. ArrayList<String> list1 = new ArrayList<>();
  11. while(iterator.hasNext()){
  12. String next = iterator.next();
  13. if ("二".equals(next)){
  14. list1.add(next);
  15. }
  16. System.out.println(next);
  17. }
  18. boolean b = list.removeAll(list1);
  19. System.out.println(list);
  20. System.out.println(list1);

2》直接进行for循环即可,使用for循环的时候可以在遍历时进行修改

  1. for (int i = 0; i < list.size(); i++) {
  2. String s = list.get(i);
  3. if ("华".equals(s)){
  4. list.remove(s);
  5. }
  6. System.out.println(s);
  7. }
  8. System.out.println(list);

最后就是

使用forearch,他如果是遍历的是集合,那么就相当于还是在使用迭代器进行遍历,不能在遍历时修改元素

但是如果遍历的是数组,那么是根据索引进行遍历的

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/588106
推荐阅读
相关标签
  

闽ICP备14008679号