黑马程序员技术交流社区

标题: for遍历list集合出现诡异情况,求高手啊 [打印本页]

作者: Miss小强    时间: 2013-4-19 10:08
标题: for遍历list集合出现诡异情况,求高手啊
本帖最后由 Miss小强 于 2013-4-19 17:23 编辑

List<Integer> list = new ArrayList<Integer>();
                list.add(33);
                list.add(323);
                list.add(313);
                list.add(567);
                list.add(567);
                list.add(567);
                list.add(567);
                for (int i : list) {
                        System.out.println(i);
                }
                ListIterator<Integer> listIterator = list.listIterator();
                while (listIterator.hasNext()) {
                        
                }
                for (int i : list) {
                        System.out.println(i);
                        //注意这里是遍历不出来的,原因我个人认为是由于访问到了最后一个角标;
                        //因为我们知道增强for循环底层是用的数组结构,由于上面listIterator.hasNext();已经遍历到结尾了
                        //所以后面的才遍历不到;
                }
作者: Miss小强    时间: 2013-4-19 10:17
关于集合与数组间的转换,数组转集合后有局限,不能使用集合的增加删除方法;
//这是为什么呢?我知道会发生一个不支持这种操作的异常,可理由何在。。。
笔记不整理不知道,一整理就出现这么多疑问。。。。
作者: 刘印12    时间: 2013-4-19 10:52
集合中存放的都是对象 你存入在-128---127之外的数是不行的
作者: 心弦上的景致    时间: 2013-4-19 11:58
刘印12 发表于 2013-4-19 10:52
集合中存放的都是对象 你存入在-128---127之外的数是不行的

1.5以后不是可以自动装箱拆箱么/
作者: Miss小强    时间: 2013-4-19 12:13
刘印12 发表于 2013-4-19 10:52
集合中存放的都是对象 你存入在-128---127之外的数是不行的

额,不是吧。
作者: 刘印12    时间: 2013-4-19 12:20
自动拆装箱是对-128===127之间的int数据进行自动拆装箱
作者: 胡发友    时间: 2013-4-19 13:31
如果,你在while循环里打印了数据,后面的for循环是可以遍历集合的
作者: 全超    时间: 2013-4-19 15:08
List<Integer> list = new ArrayList<Integer>();
                list.add(33);
                list.add(323);
                list.add(313);
                list.add(567);
                list.add(567);
                list.add(567);
                list.add(567);
                for (int i : list) {
                        System.out.println(i);
                }
                ListIterator<Integer> listIterator = list.listIterator();
                while (listIterator.hasNext()) {
                        
                }   //是不是这里大括号多余了。。循环体空的。。。

                for (int i : list) {
                        System.out.println(i);
                        //注意这里是遍历不出来的,原因我个人认为是由于访问到了最后一个角标;
                        //因为我们知道增强for循环底层是用的数组结构,由于上面listIterator.hasNext();已经遍历到结尾了
                        //所以后面的才遍历不到;
                }

作者: yufeng47    时间: 2013-4-19 15:23
首先得明白Iterator在进行while循环时,他内部的运行方式,在while循环中我们需要指定listIterator.hasNext()的角标,初始时为0,只有当我们调用了next()方法,内部才会把next当前位置的下一个角标返回给listIterator.hasNext(),也就是说这时hasNext()的值为1,这样才能满足他的完成循环条件,并且该集合实际长度大于当前 角标+1,那么循环不会结束,这就是一个i死循环,这里的循环与简单的底层数组判断结果不一样。
所以,最后的for循环肯定打印不出来了,当前main中存只有一个线程存在。
  1.         ListIterator<Integer> listIterator = list.listIterator();
  2.         while (listIterator.hasNext()) {
  3.                 System.out.println(1);

  4.         }
复制代码
加上这么一句话你就会发现问题。再去看iterator的源码你就清楚了
作者: Miss小强    时间: 2013-4-19 17:23
yufeng47 发表于 2013-4-19 15:23
首先得明白Iterator在进行while循环时,他内部的运行方式,在while循环中我们需要指定listIterator.hasNext ...

醍醐灌顶啊,终于豁然开朗了,这么简单的问题都没发现,真是惭愧啊。。。。




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