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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wodeairenw 中级黑马   /  2013-4-15 21:16  /  1624 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 wodeairenw 于 2013-4-17 20:39 编辑

理解迭代器:就如游戏机房里的夹娃娃机器,那个机器里外面的操作杆就是迭代器方法,
   我们只需要操操作杆就可以取出里面夹子(迭代器)的东西。
其实就是定义在集合里的一个内部类接口 Iterator ,对外界提供一个获取内部类对象的方法iterator()。
然后通过该对象里的方法获取集合里的元素等操作。

我的问题是上面的内部类是怎么定义的,是直接定义一个实现Iterator接口的内部类。然后iterator()方法返回一个匿名 Iterator 的内部对象?

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

7 个回复

倒序浏览
当时看视频时我跟你有一样的疑惑,于是记录了毕老师下面说的话希望对你有帮助。
    迭代器的作用:用于取出集合中的元素,这种取出方式定义在集合的内部,这样就可以直接访问集合内部的元素了,因此这种取出方式就被定义成了内部类。而每一个容器的数据结构不同,所以取出的动作细节也是不一样的,但是都有共性的内容,判断和取出,因此可以将这些共性进行抽取。
      每个集合都具备一种取出方式,但这个方式不足以用一个方法描述,比如取之前要先判断容器内是否有元素,有则取,无则不取。因此对于集合取出这一个动作,不足以用一个函数来描述,它需要多个功能来体现,因此就将这多个功能封装至对象。因数据不同,每个取出对象中取出的实现方式不一样,那么这个取出就必须描述一下,通过一个类来完成,这取出这个类就定义在了集合内部。对于集合中的元素,你要想操作,定义内部类直接在集合内部操作时最方便的。所以这个内部类就完成了取出动作的定义。
    这些内部类都符合一个规则。该规则是Iterator。如何获取集合的取出对象呢?通过一个对外提供的方法:iterator().

   下面是毕老师视频里看显示出来的迭代器源代码
   public Iterator<E> iterator()
    {
     return new Itr();
    }
  private class Itr implements Iterator<E>
   
  for(Iterator it =al.iterator();it.hasNext();)
{
  sop(it.next());
}
对于迭代器我认为只要知道它干嘛的就OK了。就是操作取出集合中的元素。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
嗯,楼主的理解是正确的。给你找源代码看,验证你的想法。另外补充点:迭代器有三种,内部迭代,内部类迭代和独立类迭代。
内部类迭代因为可以直接访问ADT(抽象数据类型,线性表是其中一种,还有图,树等)的数据,而独立类迭代(比较容易实现)是间接访问(通过ADT共有方法访问ADT数据),迭代要花更长时间。所以通常内部类迭代比较可选。

1.jpg (26.73 KB, 下载次数: 13)

1.jpg

2.jpg (53.71 KB, 下载次数: 10)

2.jpg
回复 使用道具 举报
迭代器貌似是工厂模式··
  
回复 使用道具 举报
支持一个
回复 使用道具 举报
iterator的作用是:
返回在此 collection 的元素上进行迭代的迭代器;
使用的是集合名调用iterator方法。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
易杰 中级黑马 2013-4-16 19:36:45
7#
迭代器是操作集合中元素的一个对象,这个对象定义在集合类的内部。通过集合对象的iterator()来获取迭代器对象。
迭代器有两种,一种是普通迭代器iterator,能对集合中的元素进行判断,获取,删除操作。
另一种是列表迭代器 listIterator,可以对集合中的元素进行增删改查操作。列表迭代器是List集合特有的。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
黄玉昆 黑马帝 2013-4-17 08:59:57
8#
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马