黑马程序员技术交流社区

标题: 用iterator()的好处 [打印本页]

作者: 尹旗龙    时间: 2012-2-9 17:31
标题: 用iterator()的好处
本帖最后由 尹旗龙 于 2012-2-10 06:40 编辑

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


作者: 余海龙    时间: 2012-2-9 17:43
本帖最后由 余海龙 于 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.
作者: 何洪森    时间: 2012-2-9 18:01
网上的解释也挺好的,应该可以解决你的疑问了。如下:
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,向它发送"向前","向后","取当前元素"的命令,就可以间接遍历整个集合。
作者: 黄秋    时间: 2012-2-9 18:08
使用iterator()的优势是,for 要一个变量 int i,并且对象要有size() 方法,即使有类似的方法,象数组是 length,那么size() 要改成 length, 这样可重用性就差了吧。当然iterator 要有hasNext()、next()才能遍历,但这是 iterator 必须的,有它们才成iterator 呀。

PS:现有增强型的for 循环,更方便,iterator 遍历也少用了。
作者: 任奇    时间: 2012-2-9 18:45
iterator将遍历一个序列的操作与此序列底层结构香分离. 隐藏了容器底层的结构.
迭代器是一个对象,它的工作是遍历并选择序列中的对象,而客户端程序员不必知道或关心该序列底层的结构.而且创建它的代价小.

作者: 尹旗龙    时间: 2012-2-9 18:56
黄秋 发表于 2012-2-9 18:08
使用iterator()的优势是,for 要一个变量 int i,并且对象要有size() 方法,即使有类似的方法,象数组是 le ...

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

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

增强型for循环,很多资料都有说,包括黑马的视频,下面举个例子:
                int[] array= new int[]{1,2,3};
                for(int a :array)
                        System.out.println(a);




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