黑马程序员技术交流社区

标题: 纠结了很久.才发现问题,你看懂了吗? [打印本页]

作者: a292723685    时间: 2016-3-31 22:03
标题: 纠结了很久.才发现问题,你看懂了吗?
        public static void main(String[] args) {
                LinkedList<String> a = new LinkedList<>();
                a.addFirst("a");
                a.addFirst("b");
                a.addFirst("c");
                a.addFirst("d");
                a.addFirst("e");
                for (int i = 0; i < a.size(); i++) {
                        a.removeFirst();
                }
                System.out.println(a.isEmpty());
        }
}
为什么结果是false,你看懂了吗?       
作者: huangfan    时间: 2016-3-31 22:06
我看懂了五个人黑马币就告诉你
作者: a292723685    时间: 2016-3-31 22:15
huangfan 发表于 2016-3-31 22:06
我看懂了五个人黑马币就告诉你

还能不能做朋友....
作者: yanzhendong    时间: 2016-3-31 22:41
a.size()会变化的,实际 上你只移除了大概一半的元素,还有一半的元素未移除
作者: zapple926    时间: 2016-3-31 23:10
移除了第一个元素后,第二个元素到了第一位索引变成了0,而i的值变成了1,所以漏掉了第1个。这样循环漏掉了一半。
作者: a292723685    时间: 2016-4-1 13:28
yanzhendong 发表于 2016-3-31 22:41
a.size()会变化的,实际 上你只移除了大概一半的元素,还有一半的元素未移除 ...

的确是这样,我还迷迷糊糊纠结了半小时
作者: a292723685    时间: 2016-4-1 13:29
zapple926 发表于 2016-3-31 23:10
移除了第一个元素后,第二个元素到了第一位索引变成了0,而i的值变成了1,所以漏掉了第1个。这样循环漏掉了 ...

明白,thanks!
作者: 淡然无味    时间: 2016-4-1 14:37
本帖最后由 淡然无味 于 2016-4-1 15:25 编辑

经过我的分析,觉得应该是这样的,请指教

QQ图片20160401152418.jpg (41.25 KB, 下载次数: 29)

QQ图片20160401152418.jpg

作者: 淡然无味    时间: 2016-4-1 15:08
zapple926 发表于 2016-3-31 23:10
移除了第一个元素后,第二个元素到了第一位索引变成了0,而i的值变成了1,所以漏掉了第1个。这样循环漏掉了 ...

如果按照你这种说法,那么最后输出的应该是 d、b了,但是实际上a.getLast()得到的是 b、a
作者: a292723685    时间: 2016-4-1 15:26
淡然无味 发表于 2016-4-1 14:37
经过我的分析,觉得应该是这样的,请指教

你也是蛮拼,其实就是size在变化,不是开始的那个5了
作者: a292723685    时间: 2016-4-1 15:30
淡然无味 发表于 2016-4-1 15:08
如果按照你这种说法,那么最后输出的应该是 d、b了,但是实际上a.getLast()得到的是 b、a ...

不用纠结了,其实就是条件表达式出了问题, 循环次数并不是我期望的五次,每次移除a.size()都在变....所以i会提前等于a.size().并不是全部移除...
作者: 淡然无味    时间: 2016-4-1 15:30
a292723685 发表于 2016-4-1 15:26
你也是蛮拼,其实就是size在变化,不是开始的那个5了

额,我刚开始接触,没有用过这个集合,刚刚查了下api,也是苦思冥想好久才想通的哈!
作者: 菊花爆满山    时间: 2016-4-1 15:43
长度不停的变化  可以这样写 for(int x = al.size() - 1; x >= 0; x--){}  将变化的作为x的初始值  
作者: lyoivneg    时间: 2016-4-1 15:49
移除的是 一个元素 也就是最后添加哪个元素   打印下现有集合  为 abcde  
作者: sbqtvb2007    时间: 2016-4-1 16:05
表示还没有学到这里。
作者: a292723685    时间: 2016-4-1 18:13
菊花爆满山 发表于 2016-4-1 15:43
长度不停的变化  可以这样写 for(int x = al.size() - 1; x >= 0; x--){}  将变化的作为x的初始值   ...

可以在循环前,定义一个变量记录住集合长度,然后循环的条件表达式换成小于这个变量就好了.
作者: zapple926    时间: 2016-4-2 23:24
抱歉,我说错了,添加元素到一开始,结果集合应该为 [e,d,c,b,a]
然后循环,
当i=0,小于 size的5 移除第一个元素 e, size变为4
当i=1,小于 size的4 移除第一个元素 d, size变为3
当i=2,小于 size的3 移除第一个元素 c, size变为2
当i=3,不满足小于 size的2,所以还剩下 [b,a]两个元素,所以不为空.

作者: 性感不是骚    时间: 2016-4-2 23:36
size是变化的
作者: biu    时间: 2016-4-3 00:03
for里面加个--就是true了
作者: LLQALLQ    时间: 2016-4-3 00:16
学习了。
作者: 善良的死神达乐    时间: 2016-4-3 18:22
记着了!!!!!!!谢谢大神们!!!!1
作者: aomingchao    时间: 2016-4-3 21:27
好问题,我也不会!!!
作者: zx7750462    时间: 2016-4-3 22:10
b和a不会被移除,楼主推导下循环过程就知道了
作者: a292723685    时间: 2016-4-3 23:52
zx7750462 发表于 2016-4-3 22:10
b和a不会被移除,楼主推导下循环过程就知道了

每次移除size都会减一,所以不能全部移除,我知道了




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