黑马程序员技术交流社区

标题: 求解 [打印本页]

作者: 班志国    时间: 2012-11-19 17:46
标题: 求解
本帖最后由 班志国 于 2012-11-20 15:55 编辑
  1. ArrayList al = new ArrayList();
  2. al.add("java01");
  3. al.add("java02");
  4. Iterator it = al.iterator();
  5. while(it.hasNext()){
  6.      Object obj = it.iterator();
  7.       if(obj.equals("java02"));
  8.            
  9.           al.add("java08");//为什么这样就报错????????
  10. }
复制代码

作者: 惠晖    时间: 2012-11-19 17:59
本帖最后由 惠晖 于 2012-11-19 18:10 编辑

迭代器里不可以通过集合的方法操作集合中的元素因为会发生并发修改异常
只能运用迭代器方法操作元素,因为Iterator方法是有限的 所以只能通过其子接口ListIterator 该接口只能通过List集合的listIterator方法获取

作者: 全海波    时间: 2012-11-19 18:00
标题: RE: 求解
你的判断条件呢?
作者: 奚华    时间: 2012-11-19 18:18
1、你的代码里,如果要用while来表示无限循环,如下所示
  1. while(true)//要加true,java和c不同
  2. {
  3.     //一些代码
  4. }
复制代码
2、你的代码错误较多,改正如下
  1. import java.util.ArrayList;
  2. import java.util.Iterator;
  3. import java.util.ListIterator;


  4. public class Test2{
  5.         public static void main(String[] args)
  6.         {
  7.                 ArrayList al = new ArrayList();
  8.                 al.add("java01");
  9.                 al.add("java02");
  10.                 ListIterator it = al.listIterator();//使用listIterator
  11.                 while(it.hasNext()){//用it.hasNext()来防止访问到不存在的元素
  12.                      Object obj = it.next();
  13.                       if(obj.equals("java02"))
  14.                               //这个地方毕老师讲过,你不能同时既用迭代器又用ArrayList的对象来操作数组列表,同一时间只能用一种
  15.                           it.add("java08");//这样就不会报错了

  16.                 }
  17.                
  18.                 //下面检测一下
  19.                 for(Object o:al)
  20.                 {
  21.                         System.out.println((String)o);
  22.                 }
  23.         }
  24. }
复制代码

作者: 奚华    时间: 2012-11-19 18:22
惠晖 发表于 2012-11-19 17:59
迭代器里不可以通过集合的方法操作集合中的元素因为会发生并发修改异常
只能运用迭代器方法操作元素,因为I ...

Iterator中没有add方法,ListIterator中才有!
作者: 陈军    时间: 2012-11-20 12:50
ArrayList集合在迭代过程中是不允许,用集合的方法增加或删除的。。只能用迭代器的方法。
具体的API上写得很清楚:
此类的 iterator 和 listIterator 方法返回的迭代器是快速失败的:
在创建迭代器之后,除非通过迭代器自身的 remove 或 add 方法从结构上对列表进行修改,
否则在任何时间以任何方式对列表进行修改,迭代器都会抛出 ConcurrentModificationException。因此,面对并发的修改,迭代器很快就会完全失败,而不是冒着在将来某个不确定时间发生任意不确定行为的风险。




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