黑马程序员技术交流社区

标题: 增强for循环中为什么不能对集合进行增删操作? [打印本页]

作者: 寇弘禄    时间: 2013-3-4 19:31
标题: 增强for循环中为什么不能对集合进行增删操作?
本帖最后由 寇弘禄 于 2013-3-12 10:10 编辑
  1. List<Object> list = new LinkedList<Object>();
  2.                 list.add(5);
  3.                 list.add("aa");
  4.                 list.add(2.56);
  5.                 list.add(6);
  6.                 list.add(9);
  7.                 for(Object inte : list){    //这里报个ConcurrentModificationException异常。
  8.                         if(inte.equals("aa"))
  9.                                 list.remove(0);   
  10.                         System.out.println(inte);
  11.                 }
  12.                 System.out.println(list);

  13.                 for(int i=0;i<list.size();i++){
  14.                         if(list.get(i).equals("aa"))
  15.                                 list.remove("aa");
  16.                         System.out.println(list.get(i));
  17.                 }
  18.                 System.out.println(list);
复制代码

作者: 莫嘉伟    时间: 2013-3-4 19:51
增强的Foreach循环和Iterator一样,在遍历集合的时候都不能修改集合,否则都会引发ConcurrentModificationException
作者: 侯丛政    时间: 2013-3-4 20:20
增强for中的这个list是被操作的对象,遍历时,当他获得一个元素的时候,指针已经指向下一个元素,跟Iterator的原理是一样的,
当你准备开始遍历的时候,其实取得元素顺序就已经是确定的了,如果获得到一半时你增删被遍历的对象势必会打乱
原有的顺序,这是不允许的. 但是修改的操作还是可以的

作者: 黑马李超    时间: 2013-3-4 20:39
高级for循环在对集合进行遍历时,只能获取集合中的元素,不能对集合进行操作的。
如果需要删除对象可以选择Iterator中的自有方法remove()来进行删除。
或者你可以先将要删除的元素用另一个list装起来,等遍历结束再remove掉
可以这样写
List delList = new ArrayList();//用来装需要删除的元素
for(Object inte : list)
        if(inte.equals("aa")){
                n++;
                delList.add(inte);
}
list.removeAll(delList);//遍历完成后执行删除
作者: Benwolf0818    时间: 2013-3-4 21:01
增强for循环对集合进行遍历,只能获取元素,但是不能对集合进行操作
迭代器除了遍历,还可以进行remove集合中元素的动作。
如果使用ListIterator,还可以再遍历过程中对集合进行增删改查的动作





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2