一下是两段java的for循环代码。我觉得结果应该是一样的,但是分别运行后发现,结果完全不同。
哪位朋友能告诉我,结果不同的原因是什么?LinkedList<String> list = new LinkedList<String>();
list.add("第一个");
list.add("第二个");
list.add("第三个");
list.add("第四个");
list.add("第五个");
list.add("第六个");

for(int j = 0; j < list.size(); j++){
String last = list.getLast();
System.out.println(last);
list.removeLast();
}
LinkedList<String> list = new LinkedList<String>();
list.add("第一个");
list.add("第二个");
list.add("第三个");
list.add("第四个");
list.add("第五个");
list.add("第六个");

for (int i = list.size() - 1; i >= 0; i--) {
String last = list.getLast();
System.out.println(last);
list.removeLast();
}

解决方案 »

  1.   

    原因在于你的list.szie()的值是不停变化的。
    第一个for循环,你
    第一次执行的时候
    j=0 j<6 打印出: 第六个
    第二次执行的时候
    j=1 j<5 打印出: 第五个
    第三次执行的时候
    j=2 j<4 打印出: 第四个
    第三次执行的时候
    j=2 j<3 条件不满足了,推出for循环
    第二个for循环是这样子的:
    虽然每次都i-- 这个表达式,但是它有个表达式不停的给i赋值。
    所以就变成这样:
    i=5;i>=0 打印 :第六个
    i=4;i>=0 打印 :第五个
    i=3;i>=0 打印 :第四个
    i=2;i>=0 打印 :第三个
    i=1;i>=0 打印 :第二个
    i=0;i>=0 打印 :第一个
      

  2.   

    原因在于你的list.szie()的值是变化的。
    第一个for循环,
    第一次执行的时候
    j=0 j<6 打印出: 第六个
    第二次执行的时候
    j=1 j<5 打印出: 第五个
    第三次执行的时候
    j=2 j<4 打印出: 第四个
    第三次执行的时候
    j=3 j<3 条件不满足了,推出for循环
    第二个for循环是这样子的:
    虽然每次都i-- 这个表达式,但是它有个表达式不停的给i赋值。
    所以就变成这样:
    i=5;i>=0 打印 :第六个
    i=4;i>=0 打印 :第五个
    i=3;i>=0 打印 :第四个
    i=2;i>=0 打印 :第三个
    i=1;i>=0 打印 :第二个
    i=0;i>=0 打印 :第一个
      

  3.   

    楼上说的很清楚,List 的 size 没循环一次都减一。
      

  4.   

    肯定是不一样的,remove一次,size当然会变化了
      

  5.   

    第一个程序中,size的大小在逐渐减少,而变量j在逐渐增大,当取第4个时,条件已经不成立了。
      

  6.   

    本以为for循环只有i++和i--的区别,没想到还可以这样用。
      

  7.   

    第二个for循环list的size大小随时在变化的
      

  8.   

    你的意思如果是 list.size() - 1 不停的给 i 赋值 那只能说错
    int i = list.size() - 1 只执行一次
      

  9.   

    list.size()会变,那么第一个输出的就不是全部
      

  10.   


    三楼未必对:红色部分就是错的
    int i = list.size() - 1 只执行一次 没有出错的原因是他的条件是固定的i >= 0;21楼才说出了重点
    不管在什么语言都要避免面在判断条件中用可变量
    根本的不同在:
    第一个循环条件是个可变量 
    j < list.size(); 
    第二个循环条件是定值
    i >= 0;
      

  11.   

    LinkedList<String> list = new LinkedList<String>();
            list.add("第一个");
            list.add("第二个");
            list.add("第三个");
            list.add("第四个");
            list.add("第五个");
            list.add("第六个");
            int i=list.size();
            for(int j = 0; j < i; j++){
                String last = list.getLast();
                System.out.println(last);
                list.removeLast();
            }
      

  12.   

    修改一下吧,先调用listIterator(int)返回一个迭代,再用while(listIterator.hasNext())一个一个打印,不提倡楼主这样打一个移一个
      

  13.   

    第一个的list.size() 是时刻在变的,因为你删一个,后面的就会向上挪一个,再变第二个 是固定了
      

  14.   

    循环中的size函数返回值在变化。
      

  15.   

    3楼将的很明白,lz可以debug一下,看的很清楚!
      

  16.   

    第2个FOR效率是最高的,第1个FOR效率其次而且是JDK5.0才有的。
      

  17.   

    在使用for循环时,尽量不要改变索引值和变化的值可以把长度赋值为一个变量,然后再使用。
      

  18.   

    原因在于你的list.szie()的值是不停变化的。
    第一个for循环,你
    第一次执行的时候
    j=0 j<6 打印出: 第六个
    第二次执行的时候
    j=1 j<5 打印出: 第五个
    第三次执行的时候
    j=2 j<4 打印出: 第四个
    第三次执行的时候
    j=2 j<3 条件不满足了,推出for循环
    第二个for循环是这样子的:
    虽然每次都i-- 这个表达式,但是它有个表达式不停的给i赋值。
    所以就变成这样:
    i=5;i>=0 打印 :第六个
    i=4;i>=0 打印 :第五个
    i=3;i>=0 打印 :第四个
    i=2;i>=0 打印 :第三个
    i=1;i>=0 打印 :第二个
    i=0;i>=0 打印 :第一个
      

  19.   

    问题出在list.size()它是变量呀。 
      

  20.   

    它们的循环顺序不一样,第一个for循环是从第一个开始的,循环到第三个的时候第四个也删除了,所以不能再循环下去了,所以只能打印出第一个,第二个,第三个。第二个循环是从第六个开始循环当循环到第四个后,第三个删除了,所以不能再向下循环了,所以只能打印出第六个,第五个,第四个。
      

  21.   

    第一个for循环,j递增到3,此时刚才list.size也等于3,循环条件不满足,跳出for循环,所以只打印最后三个第二个for循环,循环条件为>=0,那么将执行到list.size=0,i=-1,循环条件不满足,所以将打印所有的数据
      

  22.   

    你直接在MyEclipse上运行一下就知道了