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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 林吉敏 中级黑马   /  2012-12-16 14:22  /  2258 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 林吉敏 于 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());
                }
               

                        }

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

8 个回复

正序浏览
朋友,这里有一张是图是我当时学到迭代器的时候做的图是分析这个的。你可以看着参考一下。希望能帮助你解开疑惑。

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

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

迭代器中的hasNext方法研究学习
回复 使用道具 举报
迭代器是抽象名字,不要被它的器所迷惑,  你要想着这是一个操作List的指针,   List把它的头指针给了迭代器,当第一次使用的时候(判断有没有)it.hasNext() ;  就是说这个指针指向的位置有没有东西。如果有,参与循环。  之后的it.next()   你可以理解为,取出it当前指向的位置的东西(虽然说的很差强人意,但是我是这么理解的,next这个词太过笼统,不利于记忆。)
回复 使用道具 举报
张超 中级黑马 2013-5-31 21:50:29
7#
Iterator 是一个接口,他的子类才有具体的取出方式,每一个子类具体的取出方式是和集合的数据结构有关系,他的子类被存放在集合的内部,最为内部内。
回复 使用道具 举报
多谢各位了,明白了哈
回复 使用道具 举报
在使用hasNext判断的时候是从第一个元素的前一个位置开始判断的,第一次判断出来的下一个元素实际为集合的第一个元素,第一次使用next打印出来的是用hasnext判断出来存在的元素。也就是集合的第一个元素。然后依次判断打印,直到hasnext判断为假为止。
需要注意的是next()每运行一次,指针就向后移动一次。hasnext()则不移动指针。
回复 使用道具 举报
从源码入手解决你这个问题:

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





看看 next函数的实现




用你的理解方式是,先取当前指针指向的值,再把指针往后移~
回复 使用道具 举报
hasNext()  判断下一个元素是否存在
next()    return 下一个元素值
回复 使用道具 举报
开始指针是指向最前面的,当调用一次hasNext方法时如果返回true,表示后面还有元素,指针就会往后挪一次,next方法取到的实际上是指针指向位置的右边的元素,注意.next()除了返回一个元素之外,引用也会移动,不知道楼主懂了没。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马