黑马程序员技术交流社区

标题: 迭代输出时产生的错误 [打印本页]

作者: Fc10232    时间: 2012-5-17 18:31
标题: 迭代输出时产生的错误
import java.util.ArrayList;
import java.util.List;
import java.util.Iterator;
public class IteratorDemo {
        public static void main(String[] args) {
                List<String> all = new  ArrayList<String>();
                all.add("hello");
                all.add("-");
                all.add("world");
                Iterator<String> iter = all.iterator();
                while(iter.hasNext()){
                        String m = iter.next();
                        if("-".equals(m)){
                                all.remove(m);
                        }else{
                                System.out.print(m+",");                       //  为什么这里输出的不是:   hello  ,world
                        }
                }
               
                System.out.println("\n删除之后的结果:"+all);
        }
}

输出: hello,  
            删除之后的集合是:[hello,world]

       对这个有点不理解   删除之后直接退出循环???

作者: 田林    时间: 2012-5-17 18:52
本帖最后由 田林 于 2012-5-17 18:53 编辑

在迭代时,不可以通过集合对象的方法操作集合中的元素。因为很可能会发生ConcurrentModificationException异常。你的集合中如果再多加一个元素就会抛出异常,你可以试试!

List集合中有个特有的迭代器:ListIterator。通过它可以在迭代时对list集合中的元素进行增删。你的迭代器代码更改为:

ListIterator<String> iter = all.listIterator();
                while(iter.hasNext()){
                        String m = iter.next();
                        if("-".equals(m)){
                                iter.remove();
                        }else{
                                System.out.print(m+",");   
                        }
                }

这样就好了。别忘了导入ListIterator接口。
作者: 冯越    时间: 2012-5-17 18:52
本帖最后由 冯越 于 2012-5-17 19:42 编辑

你这个问题问的很好 我把程序的执行步骤给你详细描述一下。
首先,第一次进入while循环的时候   iter.hasNext()返回ture  接着iter.next() 返回容器里的第一个字符串 也就是 ”hello“
然后 iter迭代游标变为1    然后 System.out.print(m+","); 接着进入第二次循环 这时 iter.hasNext()返回依然是ture  然后 iter.next()返回第二个字符串 也就是 ”-“ 紧接着  iter迭代游标变为 2  
但下面的程序把 字符串”-“ 给删除了   但iter的游标已经变为2,   如果你看过java的源码 你就会发现  hasNext()的源码是这样的
public boolean hasNext() {
      return cursor != size()   //cursor就是我上面所说的游标  size就是容器的大小 你删除了容器中的一个字符串 那么你的容器大小就由3变成了2
}
所以当再次进入while的时候  iter.hasNext()     2 != 2    返回就是false了 所以最后一次并没有进入到循环内部
也就只能得到 你现在得到的结果了
我的叙述你明白了吗?

还有在容器迭代的时候是不允许对容器内的元素进行增减的 会报java.util.ConcurrentModificationException  你这次没有报错 完全是你运气好
下次不要在这样做了
作者: Fc10232    时间: 2012-5-19 12:51
田林 发表于 2012-5-17 18:52
在迭代时,不可以通过集合对象的方法操作集合中的元素。因为很可能会发生ConcurrentModificationException ...

一 你写的没明白,
二 iterator 可以为什么要用ListIterator
作者: Fc10232    时间: 2012-5-19 12:53
冯越 发表于 2012-5-17 18:52
你这个问题问的很好 我把程序的执行步骤给你详细描述一下。
首先,第一次进入while循环的时候   iter.hasNe ...

看的理解的差不多,,,  能通俗点就好了·····················
作者: 田林    时间: 2012-5-19 15:45
Fc10232 发表于 2012-5-19 12:51
一 你写的没明白,
二 iterator 可以为什么要用ListIterator

ListIterator功能更强大,包括Iterator的功能,还可以增加,修改集合中的元素。




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