黑马程序员技术交流社区

标题: 在集合中迭代的时候遇到的问题 [打印本页]

作者: 唐进    时间: 2012-10-22 14:18
标题: 在集合中迭代的时候遇到的问题
List list=new ArrayList();
                list.add("aa");
                list.add("bb");
                list.add("cc");
                Iterator iterator=list.iterator();
                while(iterator.hasNext()){
                       String string=(String)iterator.next();
                       if(string.equals("cc")){
                               list.remove(string);
                       }
                       else {
                                System.out.println(string);
                        }
                }
为什么会报异常,急,请大家帮忙看看!
作者: 王健宇    时间: 2012-10-22 14:27
           List list=new ArrayList();
       list.add("aa");
       list.add("bb");
       list.add("cc");
       Iterator iterator=list.iterator();
       while(iterator.hasNext()){
              String string=(String)iterator.next();
              if(string.equals("cc")){
                      iterator.remove();              }
              else {
                       System.out.println(string);
               }
       }
   }
程序这样写就对了,因为remove()是Iterator接口中的方法,移除当前元素,应该是Iterator接口的实例调用
作者: 黄小贝    时间: 2012-10-22 14:30
本帖最后由 黄小贝 于 2012-10-22 14:34 编辑

迭代器遍历时,会把容器数据锁住,当你再试图修改其中的内容时,会抛出java.util.ConcurrentModificationException异常,从异常的名字也可以看出来



建议改成 for


作者: 黄小贝    时间: 2012-10-22 14:36
王健宇 发表于 2012-10-22 14:27
List list=new ArrayList();
       list.add("aa");
       list.add("bb");

少侠,你确定这样编译的过?
作者: 王健宇    时间: 2012-10-22 14:41
有问题吗?求教!
作者: 黄邦荣    时间: 2012-10-22 14:42
List list=new ArrayList();
                list.add("aa");
                list.add("bb");
                list.add("cc");
                Iterator iterator=list.iterator();
                while(iterator.hasNext()){
                       String string=(String)iterator.next();
                       if(string.equals("cc")){
                               list.remove(string);
                       }
                       else {
                                System.out.println(string);
                        }
                }

在使用迭代器操作集合的时候是不可以使用集合方法中操作集合的.

解决方法:
第一种 你可以使用迭代器中的方法在对集合进行迭代时,进行其他的操作.

第二种 因为你操作的是List集合,是一个有序的集合,你也可以使用Lise集合中的get方法获取指定角标下的元素,判断如果条件成立再用操作集合的方法操作集合
作者: 黄邦荣    时间: 2012-10-22 14:45
黄小贝 发表于 2012-10-22 14:36
少侠,你确定这样编译的过?

这个方法可以呀,在迭代过程中使用迭代器中的方法操作集合中的元素.
作者: 杨政    时间: 2012-10-22 14:51
你似乎是以为remove()方法是需要传入元素从而移除传入元素吧。

看API里remove()方法的说明:从迭代器指向的集合中移除迭代器返回的最后一个元素。

remove()方法无传入参数,移除的是当前iterator.next()指向的元素。
作者: 黄小贝    时间: 2012-10-22 15:25
本帖最后由 黄小贝 于 2012-10-22 15:30 编辑
王健宇 发表于 2012-10-22 14:41
有问题吗?求教!

嗯,这里是我的问题,刚才看错了,以为你用的list.remove,我以前遇到这个问题的时候都是用for循环解决的,今天才知道可以用iterator接口中的remove解决,惭愧~

刚才dubug了一下,发现了抛出异常的原因,以及为什么iterator接口中的remove就可以解决这个问题

首先看ArrayList的 iteratior的实现,实际实现为AbstractList的一个内部类

看看具体实现,我一直以为异常是在调用remove(object)的时候抛出的,实际上是在调用完后的next函数中抛出的



在看看list.remove(object)的实现,在ArrayList中



作者: 唐进    时间: 2012-10-22 15:30
王健宇 发表于 2012-10-22 14:27
List list=new ArrayList();
       list.add("aa");
       list.add("bb");

这个方法可以,学到一招了




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