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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 温大帅 中级黑马   /  2015-3-15 14:25  /  1112 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. ArrayList al=new ArrayList();
  2.            al.add(0,"java01");
  3.            al.add(1,"java02");
  4.            al.add("java03");
  5.   ListIterator lit=al.listIterator();
  6.        while(lit.hasNext())
  7.               {
  8.                Object obj=lit.next();
  9.                 if(obj.equals("java02"))
  10.         {
  11.         al.add("java09");   //编译错误
  12.               al.remove("java02");  //编译正确
  13.                     }
  14.                }
  15.            sop(al);
复制代码

今天听毕向东老师讲集合框架,在迭代时,不可以通过集合对象的方法操作集合中的元素,会出现并发问题,因为会发生ConcurrentModifyicationException异常,在Iterator接口中只有hasNext(),next(),remove()三个方法。
但是为什么在迭代时可以使用集合对象的remove()方法操作集合元素呢,另外Iterator的子接口ListIteartor迭代时,也可以使用集合对象的remove()方法操作集合元素,不能使用其他方法ruadd(),set()操作集合元素。
我感觉是因为在Iterator接口中只有一个remove()方法的原因,可是不太懂的其中的原理,请大家帮我解答一下,谢谢。

4 个回复

倒序浏览
产生了并发修改,此时操作的同一个元素它就不知道你是存还是取,所以编译失败。
回复 使用道具 举报
xtich 发表于 2015-3-15 18:48
产生了并发修改,此时操作的同一个元素它就不知道你是存还是取,所以编译失败。 ...

但是,使用remove()方法是可以编译通过的
回复 使用道具 举报
remove()方法是迭代器里的方法,集合中的方法不可以在迭代过程中使用 不然会发生并发修改异常 只可以使用迭代器里的方法 ListIterator 是List集合的特有迭代器 只可以迭代List集合因为只有List集合有角标
回复 使用道具 举报
13922919272 发表于 2015-3-15 23:49
remove()方法是迭代器里的方法,集合中的方法不可以在迭代过程中使用 不然会发生并发修改异常 只可以使用迭 ...

但是事实上,我调用的是集合对象的remove()方法的元素,是没有问题的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马