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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 叶征东 中级黑马   /  2012-8-10 21:47  /  1781 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.util.*;
class Demo
{
           public static void sop(Object obj)
          {
                      System.out.println(obj);
          }
          public static void main(String[] args)
          {
                  method_2();
                  System.out.println("Holle world");
          }
          public static void method_2()
         {
                   ArrayList al=new ArrayList();
                   al.add("java01");
                   al.add("java02");
                   al.add("java03");
                   al.add("java04");
                   al.add("java05");
                   al.add("java06");
                   ListIterator li=al.listIterator();
                   sop("hasNext:"+li.hasNext());
                   sop("hasPrevious:"+li.hasPrevious());
                    for(;li.hasNext();){}//我只想遍历完集合中的元素,但是如果这样写的话,程序会在这儿无限循环,下面的语句就执行不到了。我将这句话换成while(li.hasNext()){},结果也是一样的。如果在{}里面加上
                            Object obj=li.next();
                            if(obj.equals("java04"))
                            {
                                         li.add("java009");
                                         sop("添加后的集合是:"+al);
                            }
这样的语句后,就正常了。请问这是为什么?如果我只想遍历完集合中的元素,我该怎么写?
                    sop("hasNext1:"+li.hasNext());
                    sop("hasPrevious1:"+li.hasPrevious());
         }

}

2 个回复

倒序浏览
//这是源代码
public boolean hasNext() {   
   return cursor != size();//指针不等于size,返回布尔值 ,注意:指针没有向下移动}
public E next() {
      checkForComodification();
         try {
                E next = get(cursor);//先取值
                lastRet = cursor++;//指针后加1
                return next;//返回内容
            } catch (IndexOutOfBoundsException e) {
                checkForComodification();
                throw new NoSuchElementException();
            }
        }
意思就是说,hasNext()只判断集合还有没有下一个元素,如果有,则返回true,没有则为false,它的指针没有向下移动。
而next()先取值,然后指针向下移动,
如果你那样写的话,它的指针永远没有向下移动,只会永远返回true,所以就无限循环了
回复 使用道具 举报
本帖最后由 焦晨光 于 2012-8-10 22:15 编辑

  for(;li.hasNext();){}//我只想遍历完集合中的元素,但是如果这样写的话,
      程序会在这儿无限循环,下面的语句就执行不到了。
   我将这句话换成while(li.hasNext()){},结果也是一样的。
           
for(;li.hasNext();){} //li.hasNext()返回的是布尔值 false和true 因为你循环体是空的,指针不会移动,所以一直返回true
while(li.hasNext()){}//类似于 while(true){}和上面的语句是同样的道理

Object obj=li.next();
if(obj.equals("java04"))
{
li.add("java009");
sop("添加后的集合是:"+al);
}
如果在{}里面加上这样的语句后,就正常了。请问这是为什么?
该语句块中定义了指针,后面的equals方法进行判断,每执行一次循环,指针都向下移动,所以情况改变。
Object obj=li.next();
如果我只想遍历完集合中的元素,我该怎么写?
很简单
{
ListIterator li=al.listIterator();
   while(li.hasNext())
{
      System.out.println(li.next());
}

}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马