Iterator、listIterator、Iterable

来源:互联网 发布:sql培训机构 编辑:程序博客网 时间:2024/05/16 08:58

1. Iterator

public interface Iterator <E>{E next();boolean hasNext();void remove();}

  java.util下面的接口, Iterator模式是用于遍历集合类的标准访问方法。它可以把访问逻辑从不同类型的集合类中抽象出来,从而避免向客户端暴露集合的内部结构。

  例如,如果没有使用Iterator,遍历一个数组的方法是使用索引:

        for(int i=0; i<array.size(); i++) {... get(i) ... }

  客户端都必须事先知道集合的内部结构,访问代码和集合本身是紧耦合,无法将访问逻辑从集合类和客户端代码中分离出来,每一种集合对应一种遍历方法,客户端代码无法复用。

  更恐怖的是,如果以后需要把ArrayList更换为LinkedList,则原来的客户端代码必须全部重写。

为解决以上问题,Iterator模式总是用同一种逻辑来遍历集合:

        for(Iterator it = c.iterater();it.hasNext(); ) { ... }

  奥秘在于客户端自身不维护遍历集合的"指针",所有的内部状态(如当前元素位置,是否有下一个元素)都由Iterator来维护,而这个Iterator由集合类通过工厂方法生成,因此,它知道如何遍历整个集合。

  客户端从不直接和集合类打交道,它总是控制Iterator,向它发送"向前","向后","取当前元素"的命令,就可以间接遍历整个集合。

2. listIterator

public interface ListIterator<E>          extends       Iterator<E>
interface ListIterator<E> extends Iterator<E>{void add (E element);void set (E newElement);boolean hasPrevious();E previous();//返回当前一个对象,没有则抛出NoSuchElementExceptionint nextIndex();int previousIndex();}

  java.util下面的接口,系列表迭代器,允许程序员按任一方向遍历列表、迭代期间修改列表,并获得迭代器在列表中的当前位置。ListIterator 没有当前元素;它的光标位置 始终位于调用 previous() 所返回的元素和调用 next() 所返回的元素之间。长度为 n 的列表的迭代器有 n+1 个可能的指针位置,如下面的插入符举例说明:
方法摘要 voidadd(E e)
          将指定的元素插入列表(可选操作)。 booleanhasNext()
          以正向遍历列表时,如果列表迭代器有多个元素,则返回 true(换句话说,如果 next 返回一个元素而不是抛出异常,则返回true)。 booleanhasPrevious()
          如果以逆向遍历列表,列表迭代器有多个元素,则返回 true Enext()
          返回列表中的下一个元素。 intnextIndex()
          返回对 next 的后续调用所返回元素的索引。 Eprevious()
          返回列表中的前一个元素。 intpreviousIndex()
          返回对 previous 的后续调用所返回元素的索引。 voidremove()
          从列表中移除由 nextprevious 返回的最后一个元素(可选操作)。 voidset(E e)
          用指定元素替换 nextprevious 返回的最后一个元素(可选操作)。

3. Iterable

    实现这个接口允许对象成为 "foreach" 语句的目标。

  Java SE5引入了Iterable接口,该接口包含一个能够产生Iteratoriterator()方法,并且Iterable接口被foreach用来在序列中移动。因此你创建了任何实现Iterable的自定义类,都可以将它用于foreach语句中。

 方法摘要
 Iterator<T>iterator()
          返回一个在一组 T 类型的元素上进行迭代的迭代器。

4. IterableIterator区别

为什么一定要实现Iterable接口,为什么不直接实现Iterator接口呢?

      看一下JDK中的集合类,比如List一族或者Set一族,都是实现了Iterable接口,但并不直接实现Iterator接口。

      因为Iterator接口的核心方法next()或者hasNext()是依赖于迭代器的当前迭代位置的。如果Collection直接实现Iterator接口,势必导致集合对象中包含当前迭代位置的数据(指针)。当集合在不同方法间被传递时,由于当前迭代位置不可预置,那么next()方法的结果会变成不可预知。除非再为Iterator接口添加一个reset()方法,用来重置当前迭代位置。但即时这样,Collection也只能同时存在一个当前迭代位置。而Iterable则不然,每次调用都会返回一个从头开始计数的迭代器。多个迭代器是互不干扰的。

5. Iterator和ListIterator区别

  1. ListIteratoradd()方法,可以向List中添加对象,而Iterator不能。
  2. ListIteratorIterator都有hasNext()next()方法,可以实现顺序向后遍历。但是ListIteratorhasPrevious()previous()方法,可以实现逆向(顺序向前)遍历。Iterator就不可以。
  3. ListIterator可以定位当前的索引位置,nextIndex()previousIndex()可以实现。Iterator没有此功能。
  4. 都可实现删除对象,但是ListIterator可以实现对象的修改,set()方法可以实现。Iterator仅能遍历,不能修改。因为ListIterator的这些功能,可以实现对LinkedListList数据结构的操作。



0 0
原创粉丝点击