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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

import java.util.LinkedList;
public class LinkedDemo
{
public static void  main(String args[]){
  LinkedList<String> link=new LinkedList<String>();
  link.add("A");
  link.add("B");
  link.add("C");   //在链表中添加三个元素
   System.out.println(link.size());//link.size()等于3
//用先进先出的方式打印输出,循环三次,输出三个元素
  for(int i=0;i<link.size();i++){
   System.out.print(link.poll()+",");
  }//此处若打印link.size()的值还是1   ,为什么还剩一个??

   /* int a=link.size();         
    System.out.println(a);
          for(int i=0;i<a;i++){
     System.out.print(i+",");
   System.out.print(link.poll()+",");
  }*/
}
}
//这里就出现问题了,这个链表里面就三个元素,link.size()又确实等于3
//可是为什么我循环三次只能输出两个呢??而我用把link.size()的返回的值
//赋给一个变量,在进行循环却能全部输出,这是为什么呢?能画图解释一下最好!

4 个回复

倒序浏览
若不赋值给变量进行循环的话,
for(int i=0;i<link.size()+2;i++){
  System.out.print(link.poll()+",");
}
为什么要循环5次
回复 使用道具 举报
问题出在for循环上。
for(int i=0;i<link.size();i++){
    System.out.print(link.poll()+",");
这个方法,link.poll()会改变link.siza()的大小,所以循环一次之后,link.size()就变成了2了,此时i=1,进行判断,可以进入循环体。
依此推,下一次就不能满足循环的条件了。
应该可以明白了。
回复 使用道具 举报
直接看例子:
  for(int i=0;i<3;i++){
   System.out.println(link.poll()+","+i);
  }
打印:
A,0
B,1
C,2
肯定是正常的,这个毫无疑问。
看你说的那种情况
我添加两行代码:
  for(int i=0;i<link.size();i++){
  System.out.println(link.size()+" link.size()---------before pool");//观察去掉之前的长度
   System.out.println(link.poll()+","+i);
   System.out.println(link.size()+" link.size()-----after pool");//观察去掉之后的长度
  }

打印:
3 link.size()---------before pool
A,0
2 link.size()-----after pool
2 link.size()---------before pool
B,1
1 link.size()-----after pool
最后一次当link.size()=1的时候,此时i=1
这样不满足循环条件所,所以就会出现剩下一个的情况
回复 使用道具 举报
一下红色部分是我做的修改,希望对楼主有帮助
import java.util.LinkedList;
public class LinkedDemo
{
        public static void  main(String args[])
        {
          LinkedList<String> link=new LinkedList<String>();
          link.add("A");
          link.add("B");
          link.add("C");   //在链表中添加三个元素
           System.out.println(link.size());//link.size()等于3
                //用先进先出的方式打印输出,循环三次,输出三个元素
          for(int i=0;i<link.size();i++)  //因为这里的link.size()的值是变化的,
                        当i=0时,执行link.poll()这句话,获取并移除了此列表的第一个元素,也就是"A",
                        结合中只剩2个元素了,"B"和"C",此时link.size()变成了2,因为元素少了一个,
                        而i自增变成了1,循环的条件还满足,又执行了link.poll()这句话,获取并移除了
                        "B"元素,此时link.size()的值为1了,而i自增为2了,条件不满足循环结束,所以
                        结果当然是输出2个元素。
          {
           System.out.print(link.poll()+",");
          }//此处若打印link.size()的值还是1   ,为什么还剩一个??

           /* int a=link.size();         
                System.out.println(a);
                          for(int i=0;i<a;i++){   因为你这里的a的值始终为3,所以可以循环3次,取出3个元素,虽然集合的长度在变化,
                                                  但是在for循环里面的控制循环次数的值没改变。
                 System.out.print(i+",");
           System.out.print(link.poll()+",");
          }*/
        }
}
//这里就出现问题了,这个链表里面就三个元素,link.size()又确实等于3
//可是为什么我循环三次只能输出两个呢??而我用把link.size()的返回的值
//赋给一个变量,在进行循环却能全部输出,这是为什么呢?能画图解释一下最好!
理解好poll方法跟for循环这个问题就很好理解了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马