黑马程序员技术交流社区

标题: 问下关于迭代器的问题 [打印本页]

作者: 林吉敏    时间: 2012-12-16 14:22
标题: 问下关于迭代器的问题
本帖最后由 林吉敏 于 2012-12-16 17:38 编辑

刚学到集合这边,迭代器看的有点不懂,比如在下面迭代器部分
刚开始指针指向第一个元素时,打印的怎么是下一个元素,这是怎么循环的不懂??

class  CollectionDemo
{
        public static void main(String[] args)
        {
               
                method_get();
        }
        public static void method_get()
        {
                ArrayList al = new ArrayList();

                //1,添加元素。
                al.add("java01");//add(Object obj);
                al.add("java02");
                al.add("java03");
                al.add("java04");

               
                Iterator it = al.iterator();
                while(it.hasNext())
                {
                        System.out.println(it.next());
                }
               

                        }


作者: 李小锋    时间: 2012-12-16 15:21
开始指针是指向最前面的,当调用一次hasNext方法时如果返回true,表示后面还有元素,指针就会往后挪一次,next方法取到的实际上是指针指向位置的右边的元素,注意.next()除了返回一个元素之外,引用也会移动,不知道楼主懂了没。
作者: yuchen208    时间: 2012-12-16 15:28
hasNext()  判断下一个元素是否存在
next()    return 下一个元素值
作者: 黄小贝    时间: 2012-12-16 15:50
从源码入手解决你这个问题:

ArrayList的迭代器的实现位于 AbstractList类中的 命名为Itr的内部类





看看 next函数的实现




用你的理解方式是,先取当前指针指向的值,再把指针往后移~

作者: 焦健    时间: 2012-12-16 17:18
在使用hasNext判断的时候是从第一个元素的前一个位置开始判断的,第一次判断出来的下一个元素实际为集合的第一个元素,第一次使用next打印出来的是用hasnext判断出来存在的元素。也就是集合的第一个元素。然后依次判断打印,直到hasnext判断为假为止。
需要注意的是next()每运行一次,指针就向后移动一次。hasnext()则不移动指针。
作者: 林吉敏    时间: 2012-12-16 17:38
多谢各位了,明白了哈
作者: 张超    时间: 2013-5-31 21:50
Iterator 是一个接口,他的子类才有具体的取出方式,每一个子类具体的取出方式是和集合的数据结构有关系,他的子类被存放在集合的内部,最为内部内。
作者: jìng╮煜    时间: 2013-9-17 10:11
迭代器是抽象名字,不要被它的器所迷惑,  你要想着这是一个操作List的指针,   List把它的头指针给了迭代器,当第一次使用的时候(判断有没有)it.hasNext() ;  就是说这个指针指向的位置有没有东西。如果有,参与循环。  之后的it.next()   你可以理解为,取出it当前指向的位置的东西(虽然说的很差强人意,但是我是这么理解的,next这个词太过笼统,不利于记忆。)
作者: syusikoku    时间: 2014-3-6 19:20
朋友,这里有一张是图是我当时学到迭代器的时候做的图是分析这个的。你可以看着参考一下。希望能帮助你解开疑惑。

迭代器中的hasNext方法研究学习.PNG (76.21 KB, 下载次数: 97)

迭代器中的hasNext方法研究学习

迭代器中的hasNext方法研究学习





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