黑马程序员技术交流社区

标题: 关于迭代器并发修改问题 [打印本页]

作者: 夏尔    时间: 2015-5-27 17:31
标题: 关于迭代器并发修改问题
Iterator it = al.iterator();
while(it.hasNext())
{
      Object obj = it.next();
      if(obj.equals("abc01"))
      al.add("abc02");
      System.out.println(obj)
}   这样会发生并发修改问题

下面这个怎么又没事
Iterator it = al.iterator();
while(it.hasNext())
{
Object obj = it.next();
if(!newAl.contains(obj))
newAl.add(obj);
}

作者: zouzouzou    时间: 2015-5-27 17:31
首先你要明白迭代器的原理,迭代器对象是依据于集合对象而存在的,因为集合的数据结构不一样,每个集合(单列集合)都有自己的迭代器,所以说迭代器在迭代过程中集合时不能发生变化的。你刚才的代码集合做了添加!!  所以会发生并发修改异常  !!如果你想改变集合 迭代器不会报错,可以使用List特有的迭代器,ListIterager来迭代。这样你的集合改变,迭代器会自动改变,不会保存。你第二段代码,操作的是另一个集合,和当前迭代器没有关系,所以没有报错。。然后能给我黑马币吗。。我69期的,面试过了,就差技术分了。。。我还可以告诉你以后面试注意的一些东西。。。。好人一生平安啊
作者: l598790586    时间: 2015-5-27 20:04
你下面那个程序中的add方法操作的是另外一个集合,怎么可能发生并发修改问题呢?
如果你的newAl.add(obj);  改成al.add(obj)那会出现并发问题了。你的迭代器和集合操作的都不是同一个集合肯定没问题的
作者: 开弓没有回头箭    时间: 2015-5-27 21:44
并发修改错误是在创建集合对象迭代器后,集合对象对自身内容进行修改时发生的。
这个错误是因为迭代器创建后,迭代器就无法知道集合对象内容修改
在上面例子中第一个满足该错误发生条件,第二个例子中迭代器创建后没有对自身对象修改,而修改的另一个集合对象,另一个集合对象没有创建迭代器,所以不会发生。如果对另一个集合对象也创建一个迭代器,同样会发生错误
作者: 流泪的青蛙    时间: 2015-5-27 23:20
刚开始Java  不太懂哦
作者: 君子无醉    时间: 2015-5-28 08:37
迭代器是依赖于集合而存在的 你的这一步Iterager it=al.iterager();  相当于把集合的一个模板给了迭代器,然后制造出了对象it, 你的第一块代码  如果满足条件,就往集合中添加元素  当元素添加到集合里去,集合就会发生改变,而这个时候迭代器却不知道,没有发生改变,也就是集合和迭代器不是一一对应关系,所以会发生并发修改异常  如果你想改变集合 迭代器不会报错,可以使用List特有的迭代器,ListIterager来迭代。这样你的集合改变,迭代器会自动改变,不会保存。你第二段代码,操作的是另一个集合,和当前迭代器没有关系,应该不会报错吧
作者: 君子无醉    时间: 2015-5-28 08:39
sorry  迭代器拼错了,和Integer混了  应该是iterator
作者: yq582321562    时间: 2015-5-30 21:41
发现自己还需努力   
作者: lucien_he    时间: 2015-5-31 11:22
努力加油!!
作者: q757571446    时间: 2015-6-6 23:27
可以使用List集合特有的迭代器就不会报错了




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