黑马程序员技术交流社区

标题: 迭代器如何用? [打印本页]

作者: 张成龙    时间: 2012-4-26 19:05
标题: 迭代器如何用?
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?

作者: 徐鑫    时间: 2012-4-26 19:14
//Iterator it= al.iterator();
  while(al.iterator().hasNext())//这里这么写就是每次都生成一个新的迭代器,而al的第一个值是java01,因此成死循环,一直打印java01
  {
   System.out.println(al.iterator().next());
  }
}
作者: 高彰谦    时间: 2012-4-26 19:29
  1. public Iterator<E> iterator() {
  2.         return new Itr();
  3.     }
复制代码
这是iterator()方法的源码,更清楚了吧。
作者: 高彰谦    时间: 2012-4-26 19:30
  1. public Iterator<E> iterator() {
  2.         return new Itr();
  3.     }
复制代码
这是iterator()方法的源码,更清楚了吧。
作者: 崔仁军    时间: 2012-4-26 19:33
因为你在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);
   }

}
}

作者: 光sail    时间: 2012-4-26 19:36
楼主创建的迭代器很少见,也许是迭代器只能用固定的格式书写,其他格式不读取;
下面的代码运行起来就比较正常了
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


作者: chenwei    时间: 2012-4-26 19:39
不注释也会死循环了,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
因为al是集合ArrayList的对象,而Iterator是专门的集合框架迭代器只有他的对象才能执行hasNext()或next()方法,所以当去掉Iterator it= al.iterator()后al不能自动迭代




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