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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张成龙 中级黑马   /  2012-4-26 19:05  /  3095 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.util.*;
class  CollectionDemo
{
public static void main(String[] args)
{
   method_get();
}
public static void method_get()
{
  ArrayList al = new ArrayList();
  al.add("java01");
  al.add("java02");
  al.add("java03");
  al.add("java04");
  //Iterator it= al.iterator();
  while(al.iterator().hasNext())
  {
   System.out.println(al.iterator().next());
  }
}
}
Iterator it= al.iterator();这句注释掉之后为什么一直打印java01?

7 个回复

倒序浏览
//Iterator it= al.iterator();
  while(al.iterator().hasNext())//这里这么写就是每次都生成一个新的迭代器,而al的第一个值是java01,因此成死循环,一直打印java01
  {
   System.out.println(al.iterator().next());
  }
}
回复 使用道具 举报
  1. public Iterator<E> iterator() {
  2.         return new Itr();
  3.     }
复制代码
这是iterator()方法的源码,更清楚了吧。
回复 使用道具 举报
  1. public Iterator<E> iterator() {
  2.         return new Itr();
  3.     }
复制代码
这是iterator()方法的源码,更清楚了吧。
回复 使用道具 举报
因为你在while 循环的条件里写al.iterator().hasNext()相当于是每循环一次都会生成一个迭代器 判断是否还有下一个如果有就是true  ,那么每次都会生成迭代器都会有下一个都会判断为true,就成了死循环,就不停的打印那一个
修改代码如下:
import java.util.*;
class  CollectionDemo
{
public static void main(String[] args)
{
    method_get();
}
public static void method_get()
{
   ArrayList al = new ArrayList();
   al.add("java01");
   al.add("java02");
   al.add("java03");
   al.add("java04");
   for(Iterator iter = al.iterator();iter.hasNext();)
  {
           String str = (String ) a1.next();
           System.out.println(str);
   }

}
}
回复 使用道具 举报
楼主创建的迭代器很少见,也许是迭代器只能用固定的格式书写,其他格式不读取;
下面的代码运行起来就比较正常了
public static void main(String[] args)
{
   method_get();
}
public static void method_get()
{
  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());
  }
}
}
打印输出为  java01
java02
java03
java04

回复 使用道具 举报
不注释也会死循环了,al.iterator()就是获取一个新的迭代器 ,就变成每次循环都重新获取迭代器,重新从第一个开始找,就一直循环了
//Iterator it= al.iterator();
   while(al.iterator().hasNext())
改成
Iterator it= al.iterator();
  {
    System.out.println(it.next());
   }

   while(ithasNext())
回复 使用道具 举报
亚男 中级黑马 2012-4-26 19:50:59
8#
因为al是集合ArrayList的对象,而Iterator是专门的集合框架迭代器只有他的对象才能执行hasNext()或next()方法,所以当去掉Iterator it= al.iterator()后al不能自动迭代
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马