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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 尹旗龙 黑马帝   /  2012-2-9 17:31  /  9244 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 尹旗龙 于 2012-2-10 06:40 编辑

看老师的视频 需要取list里的数据时都是
Iterator it = list.iterator();
  while (it.hasNext()) {
。。。。。。。  
  }
但是for(int i=0;i<list.size();i++){
。。。。。
  }
也完全可以胜任这个工作啊 那么使用iterator()的优势具体是什么呢

7 个回复

倒序浏览
本帖最后由 余海龙 于 2012-2-9 17:51 编辑

迭代器的基本原理:
      由于不同集合的数据结构不同,取出元素方式不同。
      为了方便于对每一个容器进行取出的操作,对容器进行共性的抽取。
每一个集合的取出方式都包含:
hasNext()
{
        code。。。
}
next()
{
}


好处:降低了数据结构的耦合性。

iterator的特点是:将遍历一个序列的操作与此序列底层结构香分离.
  Iterator隐藏了容器底层的结构.
迭代器是一个对象,它的工作是遍历并选择序列中的对象,而客户端程序员不必知道或关心该序列底层的结构.而且创建它的代价小.
import   java.util.*;
public   class   Printer{
static   void   printAll(Iterator   e){
while(e.hasNext())
      System.out.println(e.next());
}
}
这个程序中,没有关于序列类型的信息,只有一个迭代器Iterator.不需要知道要遍历的是ArrayList还是LinkedList.

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
网上的解释也挺好的,应该可以解决你的疑问了。如下:
Iterator模式是用于遍历集合类的标准访问方法。它可以把访问逻辑从不同类型的集合类中抽象出来,从而避免向客户端暴露集合的内部结构。
   例如,如果没有使用Iterator,遍历一个数组的方法是使用索引:
for(int i=0; i<array.size(); i++) { ... get(i) ... }
   而访问一个链表(LinkedList)又必须使用while循环:
while((e=e.next())!=null) { ... e.data() ... }
   以上两种方法客户端都必须事先知道集合的内部结构,访问代码和集合本身是紧耦合,无法将访问逻辑从集合类和客户端代码中分离出来,每一种集合对应一种遍历方法,客户端代码无法复用。
   更恐怖的是,如果以后需要把ArrayList更换为LinkedList,则原来的客户端代码必须全部重写。
   为解决以上问题,Iterator模式总是用同一种逻辑来遍历集合:
for(Iterator it = c.iterater(); it.hasNext(); ) { ... }
   奥秘在于客户端自身不维护遍历集合的"指针",所有的内部状态(如当前元素位置,是否有下一个元素)都由Iterator来维护,而这个Iterator由集合类通过工厂方法生成,因此,它知道如何遍历整个集合。
   客户端从不直接和集合类打交道,它总是控制Iterator,向它发送"向前","向后","取当前元素"的命令,就可以间接遍历整个集合。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
使用iterator()的优势是,for 要一个变量 int i,并且对象要有size() 方法,即使有类似的方法,象数组是 length,那么size() 要改成 length, 这样可重用性就差了吧。当然iterator 要有hasNext()、next()才能遍历,但这是 iterator 必须的,有它们才成iterator 呀。

PS:现有增强型的for 循环,更方便,iterator 遍历也少用了。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
iterator将遍历一个序列的操作与此序列底层结构香分离. 隐藏了容器底层的结构.
迭代器是一个对象,它的工作是遍历并选择序列中的对象,而客户端程序员不必知道或关心该序列底层的结构.而且创建它的代价小.
回复 使用道具 举报
黄秋 发表于 2012-2-9 18:08
使用iterator()的优势是,for 要一个变量 int i,并且对象要有size() 方法,即使有类似的方法,象数组是 le ...

关于增强型for循环可否再讲点?或者举个使用增强型for循环遍历的例子
回复 使用道具 举报
何森 发表于 2012-2-9 18:01
网上的解释也挺好的,应该可以解决你的疑问了。如下:
Iterator模式是用于遍历集合类的标准访问方法。它可 ...

使用迭代器是面向对象封装性的体现。安全,灵活。
回复 使用道具 举报
黄秋 黑马帝 2012-2-9 21:16:36
8#
尹旗龙 发表于 2012-2-9 18:56
关于增强型for循环可否再讲点?或者举个使用增强型for循环遍历的例子

增强型for循环,很多资料都有说,包括黑马的视频,下面举个例子:
                int[] array= new int[]{1,2,3};
                for(int a :array)
                        System.out.println(a);
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马