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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 夏尔 中级黑马   /  2015-5-27 17:31  /  5165 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

5黑马币
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);
}

最佳答案

查看完整内容

首先你要明白迭代器的原理,迭代器对象是依据于集合对象而存在的,因为集合的数据结构不一样,每个集合(单列集合)都有自己的迭代器,所以说迭代器在迭代过程中集合时不能发生变化的。你刚才的代码集合做了添加!! 所以会发生并发修改异常 !!如果你想改变集合 迭代器不会报错,可以使用List特有的迭代器,ListIterager来迭代。这样你的集合改变,迭代器会自动改变,不会保存。你第二段代码,操作的是另一个集合,和当前迭代 ...

9 个回复

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