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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 钟伟杰 中级黑马   /  2013-4-23 01:56  /  2030 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 钟伟杰 于 2013-4-23 10:59 编辑

import java.util.*;
class TestDemo2
{
       public static void main(String[] args)
       {
              ArrayList al = new ArrayList();
              al.add("java01");
              al.add("java02");
              al.add("java03");
              al.add("java04");

              Iterator it = al.iterator();

              while(it.hasNext())
              {
                     System.out.println("第一次:"+it.next());
              }
              while(it.hasNext())
              {
                     System.out.println("第二次:"+it.next());
              }
       }
}

结果只是输出第一次遍历的元素。
next():方法只是返回迭代的下一个元素,一次遍历后ArrayList中的元素应该还在啊,怎么第二次的遍历没有显示呢?

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

11 个回复

倒序浏览
因为迭代器内的指针已到集合末尾
要想在一次遍历集合  需要重新获取迭代器 (好比指针复原一样)
回复 使用道具 举报
你可以第二次遍历的时候,再重新定义一个迭代器。
回复 使用道具 举报
迭代器:当迭代器进行循环,到迭代器结束时,迭代器是不会从新开始,只能是你重新在获取一个新的迭代器,否则,他是没有数据的;
例如:  
public static void main(String[] agrs) {

                 ArrayList al= new ArrayList();
         al.add("java01");
         al.add("java02");
         al.add("java03");
         al.add("java04");

         Iterator it = al.iterator();

         while(it.hasNext())
         {
                System.out.println("第一次:"+it.next());
         }
         
         it = al.iterator();

         while(it.hasNext())
         {
                System.out.println("第二次:"+it.next());
         }
        }
这样子的话,就可输出第二次。

评分

参与人数 1技术分 +2 收起 理由
滔哥 + 2

查看全部评分

回复 使用道具 举报
本帖最后由 肖川 于 2013-4-23 08:55 编辑

第一次遍历后ArrayList中的元素是还在啊,但是iterator迭代器已经循环完成了啊,所以进入第二个for循环的时候it已经没有数据了啊。如果你想知道,第几次迭代出的是哪个元素可以这样写:
  1. Iterator it = al.iterator();

  2. int i=1;     
  3. Iterator it = al.iterator();
  4. while(it.hasNext())
  5.          {
  6.                 System.out.println("第"+i+"次:"+it.next());
  7.                 i++;
  8.          }
复制代码

评分

参与人数 1技术分 +2 收起 理由
滔哥 + 2

查看全部评分

回复 使用道具 举报
第一次迭代结束的时候迭代器已经指向了末尾,已经没有next元素了。。。所以在你第二次迭代是已经没有元素了。。。。
回复 使用道具 举报
第二次迭代器已经指向尾部了.就好比for(i = 0; i < len;i++),一遍循环下来,i不是已经是为len了。所以第二遍遍历的时候,还要初始化迭代器。
回复 使用道具 举报
因为你用的是迭代器,用迭代方法,迭代方法的特点是,如果容器里还有元素,迭代器就会把元素取出来,每取完一次元素之后,就用hasNext()方法判断容器内是否剩元素,如果还有,则返回true,所以第一个while()括号里的表达式就为真,那就会进入循环,直到把容器里的元素全部取出来。元素全部取出来之后,hasNext()返回的就是false了。所以执行到第二个while时,false不满足条件,所以根本不会进入到循环里面,所以你的第二次就不会被打印了。懂了没有,哈哈哈。
回复 使用道具 举报
沈浩 发表于 2013-4-23 02:07
因为迭代器内的指针已到集合末尾
要想在一次遍历集合  需要重新获取迭代器 (好比指针复原一样) ...

谢谢,明白了
回复 使用道具 举报
沈浩 发表于 2013-4-23 02:07
因为迭代器内的指针已到集合末尾
要想在一次遍历集合  需要重新获取迭代器 (好比指针复原一样) ...

谢谢,明白了
回复 使用道具 举报
smallsea 发表于 2013-4-23 07:19
迭代器:当迭代器进行循环,到迭代器结束时,迭代器是不会从新开始,只能是你重新在获取一个新的迭代器,否 ...

谢谢你,不过纠正一下,迭代完集合的数据还在,正如一二楼说的只是指针指向了最后面,在迭代完后面打印一下集合就得到验证了。
回复 使用道具 举报
肖川 发表于 2013-4-23 08:36
第一次遍历后ArrayList中的元素是还在啊,但是iterator迭代器已经循环完成了啊,所以进入第二个for循环的时 ...

谢谢,明白了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马