黑马程序员技术交流社区
标题:
迭代器问题
[打印本页]
作者:
我是小白
时间:
2013-3-26 23:03
标题:
迭代器问题
ArrayList e1=new ArrayList();
e1.add("java01");
e1.add("java02");
e1.add("java03");
e1.add("java04");
ListIterator li =e1.listIterator();
while(li.hasNext())
{
Object obj=li.next();
if(obj.equals("java01"))
e1.add("java009");
li.set("java006");
}
上述代码运行的时候为什么会报java.util.ConcurrentModificationException,不是已经使用了List特有的迭代器了么?
作者:
陈圳
时间:
2013-3-26 23:11
if(obj.equals("java01"))
e1.add("java009");//这里你忘了,你用的是Arraylist的对象方法 add,不是ListIterator的对话方法 add
li.set("java006");
作者:
孙百鑫
时间:
2013-3-26 23:29
楼上说的差不多.你用的是ArrayList的方法添加的当然不对了...应该用ListIterator的方法.....不应该e1.应该是li
ArrayList e1=new ArrayList();
e1.add("java01");
e1.add("java02");
e1.add("java03");
e1.add("java04");
ListIterator li =e1.listIterator();
while(li.hasNext())
{
Object obj=li.next();
if(obj.equals("java01"))
e1.add("java009");//这里你改一下.li.add("java009");试试.
li.set("java006");
}
作者:
崔宝东
时间:
2013-3-27 09:44
ListIterator li =e1.listIterator();
while(li.hasNext())
{
Object obj=li.next();
if(obj.equals("java01"))
e1.add("java009");
li.set("java006");
}
你使用列表迭代器ListIterator就要用列表迭代器的方法,
你现在用的是 e1.add("java009");集合中的方法,所有会报java.util.ConcurrentModificationException
修改一下就好了,用 li.add("java009");这样就不会报异常了;
作者:
123
时间:
2013-3-27 10:18
Iterator迭代器在迭代的过程中检测到该集合已经被修改,程序就会立即引发java.util.ConcurrentModificationException异常,这样可以避免共享资源而引发的潜在问题,而上述代码中e1.add("java009")是在修改正在遍历的集合,所以会引发这种异常,应该采用listIterator提供的add()方法来对集合进行修改,应该改为
import java.util.*;
class Demo{
public static void main(String[] args){
List<String> e1 = new ArrayList<String>();//最好改成面向List接口编程,便于以后的扩展。
e1.add("java01");
e1.add("java02");
e1.add("java03");
e1.add("java04");
ListIterator<String> li =e1.listIterator();
while(li.hasNext())
{
String obj=li.next();
if(obj.equals("java01"))
li.add("java009");
//li.set("java006"); 迭代器并未提供这种方法,不能使用。
}
System.out.println(e1);
}
}
作者:
朱德帅
时间:
2013-3-30 22:44
ArrayList e1=new ArrayList();
e1.add("java01");
e1.add("java02");
e1.add("java03");
e1.add("java04");
ListIterator li =e1.listIterator();
while(li.hasNext())
{
Object obj=li.next();
if(obj.equals("java01"))
li.add("java009"); //这里应该调用迭代器的add()方法
li.set("java006");
}
说明:如果你调用集合的add()方法增加对象时,这时候你没有通知迭代器,就会产生集合与迭代器不匹配。就是指针没有指向正确的位置,由于你添加了一个对象,但是迭代器不知道,所以它会错误的指向下下个对象。不知道这样说你是否明白!
作者:
薛淑凯
时间:
2013-4-24 17:27
王维帝 发表于 2013-3-27 10:18
Iterator迭代器在迭代的过程中检测到该集合已经被修改,程序就会立即引发java.util.ConcurrentModification ...
ListIterator迭代器是有set()方法的,替换操作
作者:
kaka小明
时间:
2013-4-24 22:48
按楼主的方法,list变化时,迭代器还是用的原来的迭代器,并为随着list的更新而更新。要用迭代器的add方法。
作者:
归☆夜↑『
时间:
2013-5-27 17:25
对集合遍历时集合的元素只能用迭代器修改
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2