黑马程序员技术交流社区

标题: 迭代器的一些疑问 [打印本页]

作者: Amu    时间: 2015-5-30 23:54
标题: 迭代器的一些疑问
当迭代器去集合元素进行迭代时,当调用集合方法对集合进行增加或删除元素时,会发生并发修改异常,但
用集合方法对元素进行修改时并不会发生异常,这是为什么类
作者: 我本灬无名    时间: 2015-5-31 00:05
看码。。。


  1. import java.util.ArrayList;
  2. import java.util.Iterator;
  3. import java.util.List;
  4. import java.util.ListIterator;

  5. public class CollectionTest1 {
  6. public static void main(String[] args) {
  7.         List list = new ArrayList();
  8.         list.add( "hello");
  9.         list.add ("world");
  10. //        Iterator it =list.iterator();
  11. //        while(it.hasNext()){
  12. //                String s = (String) it.next();
  13. //                if("hello".equals(s)){
  14. //                        list.add("IOS");
  15. //                }
  16.         ListIterator it =list.listIterator();
  17.         while(it.hasNext()){
  18.                 String s = (String) it.next();
  19.                 if("hello".equals(s)){
  20.                         it.add("IOS");
  21.                 }
  22.         }System.out.println(list);
  23. }
  24. }
复制代码

因为第一种使用List里面add方法添加元素。集合变了,而迭代器并没有修改。所以并发修改异常
作者: 我本灬无名    时间: 2015-5-31 00:06

手贱,提交了。。

第二种,是用迭代器 it 本身的 add方法添加。这时候的元素是添加到遍历的元素后边的,所以木有异常。
作者: 微凉的暮色    时间: 2015-5-31 00:14
:victory:
我再乱说一句,迭代器运行后会有一个自己的缓存数据,利用自己增删方法时,会连集合内一起修改
但如果只是集合方法的话 迭代器来不及COPY ,所以一生气就挂了
作者: 想要那片海    时间: 2015-5-31 07:51
因为迭代器通过原集合的iterator 方法获取的,hasNaxt 方法是在判断迭代器中是否还有下一个元素,next 是在获取下一个可以迭代的元素,如果你在迭代获取元素的过程增删,就导致现有的集合和原有集合元素数量的不一致,hasNext 和next 有可能就迭代不到相应的元素,我是这么理解的
作者: 武汉小菜鸟    时间: 2015-5-31 23:56
我是这么理解的:在迭代的过程当中,对元素进行修改并不会破坏迭代器指针的指向,如果进行增删是话,只能使用迭代器的remove进行删除,不能使用集合的增删方法,因为会改变迭代器指针的指向,(对于无序的set)可能会使一个数据迭代了多次,引发迭代异常

若果理解有误,大家可以探讨一下




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