A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马-王泽斌 初级黑马   /  2012-8-10 22:18  /  1439 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么在集合里不能用增强for循环进行数据的删除操作?

5 个回复

正序浏览
  1. public class ForDemo {

  2.         /**
  3.          * @param args
  4.          */
  5.         public static void main(String[] args) {
  6.                 List list=new ArrayList();
  7.                 list.add(1);
  8.                 list.add(2);
  9.                 list.add(3);
  10.                 System.out.println(list);
  11.                 for(Object obj:list){
  12.                         System.out.print(obj);
  13.                         //list.remove(0);//会出java.util.ConcurrentModificationException
  14.                         list.set(1, 8);
  15.                 }
  16.                 System.out.println(list);
  17.                
  18.                
  19.        
  20.         }

  21. }
复制代码
输出的结果是
[1, 2, 3]
183[1, 8, 3]

其中list还是可以改变的,
但是remove,add等方法,会改变list的结构,在迭代的时候,会发生并发异常。
回复 使用道具 举报
本帖最后由 尤洋 于 2012-8-10 22:47 编辑

原因很简单,增强for底层调用的是Iterator,
但是在迭代时,不可以通过集合对象的方法操作集合中的元素。
因为会发生ConcurrentModificationException异常。
所以为了安全性考虑 集合里不能用增强for循环进行数据的删除操作

如果必须要操作数据的话,可以使用迭代器自身的方法去操作,可是Iterator方法是有限的,
只能对元素进行判断,取出,删除的操作,
如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator。
该接口只能通过List集合的listIterator方法获取。

回复 使用道具 举报
问题已经解决
回复 使用道具 举报
遍历集合过程中,不能对集合本身进行操作的吧   印象里是这个原因
回复 使用道具 举报
增强for循环,只是用来进行简单的遍历数组和集合
它无法访问集合和数组中的内容更不可以删除或改变集合中的元素
增强for循环的优点是:使代码简洁易懂
缺点是有很大的局限性:无法访问和改变集合中的元素

如果想要访问和处理集合中的元素就必须要用Iterator接口里的方法来操作
可以用Iterator接口的remove()方法删除集合中的元素
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马