黑马程序员技术交流社区

标题: 请教大家个问题,会的帮忙解决一下 [打印本页]

作者: 走遍世界找寻你    时间: 2013-11-18 09:48
标题: 请教大家个问题,会的帮忙解决一下
package cn.itcast.list;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Demo2 {
        public static void main(String[] args) {
                List list = new ArrayList();
                list.add("aaa");
                list.add("bbb");
                list.add("ccc");
                list.add("ddd");
                list.add("eee");
                Iterator it = list.iterator();
                while(it.hasNext()) {
                        Object obj = it.next();
                        if("aaa".equals(obj)){
                                list.add("ggg");
                        }
                }
                System.out.println(list);
        }
}
为什么会出java.util.ConcurrentModificationException这个异常啊,怎么就不可以加呢?


作者: 王雨神    时间: 2013-11-18 10:04
Iterator 是工作在一个独立的线程中,并且拥有一个 mutex 锁。 Iterator 被创建之后会建立一个指向原来对象(也就是你的list集合)的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。
所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。

作者: 亲雨泽    时间: 2013-11-18 10:05
在迭代时,不可以通过集合对象的方法操作集合中的元素。因为会发生ConcurrentModificationException异常。
所以在迭代时,只能用迭代器的方法操作元素,可是Iterator方法是有局限性的。只能对元素进行判断,取出,删除的操作。
如果想要其他的操作如添加,修改等,就需要使用其子接口:ListIterator。
该接口只能通过List集合的listIterator方法获取。
作者: 王雨神    时间: 2013-11-18 10:12
亲雨泽 发表于 2013-11-18 10:05
在迭代时,不可以通过集合对象的方法操作集合中的元素。因为会发生ConcurrentModificationException异常。
...

呵呵,老兄把解决方法都写上了,我忘了写了。
作者: wjj410830911    时间: 2013-11-18 10:18
  1. import java.util.ArrayList;
  2. import java.util.Iterator;
  3. import java.util.List;

  4. public class Demo2 {
  5.         public static void main(String[] args) {
  6.                 List list = new ArrayList();
  7.                 list.add("aaa");
  8.                 list.add("bbb");
  9.                 list.add("ccc");
  10.                 list.add("ddd");
  11.                 list.add("eee");
  12.                 Iterator it = list.iterator();
  13.                 while(it.hasNext()) {
  14.                         Object obj = it.next();
  15.                         if("aaa".equals(obj)){
  16.                                 //list.add("ggg");
  17.                                         //这里怎么会调用list的方法呢
  18.                                         it.remove();//例如 删除“aaa”
  19.                                         //这里应该调用it对象的方法啊
  20.                         }
  21.                 }
  22.                 System.out.println(list);
  23.         }
  24. }
复制代码

作者: 黄炳期    时间: 2013-11-18 12:35
如果问题已经解决,请及时修改主题为“提问结束”。
修改主题的方法链接
http://bbs.itheima.com/thread-89313-1-1.html

作者: 黄炳期    时间: 2013-11-18 12:37
如果问题已经解决,请及时修改主题为“提问结束”。
修改主题的方法链接
http://bbs.itheima.com/thread-89313-1-1.html





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