List的两种遍历方法,如下代码所示:
<span style="font-family:SimSun;">import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.ListIterator; public class IteratorTest { static String []data = {"orange","apple","banana","pear","orange","grape"}; static List list = new ArrayList<String>(); // 利用iterator遍历 public static void traversal1(){ Iterator iterator = list.iterator(); while (iterator.hasNext()){ System.out.println(iterator.next()); } System.out.println(list); } public static void traversal2(){ list = Arrays.asList(data); for (String s : data){ // 利用for遍历 System.out.println(s); } } public static void main(String[]args){ for (int i =0;i<data.length;i++){ list.add(data[i]); } traversal1(); traversal2(); } } </span>
代码中对List用两种方法生成,其实第二种List不是真正的List,只是Arrays$ArrayList,不能进行remove()等操作,这是后话。
在java中的List及其他集合类中需要遍历时,可以采用get()和for进行,但是这样有一个明显的缺点,List本身和对List的访问操作耦合性强,为了使得对List乃至Colletion的操作与数据本身分离,产生了iterator模式。
GOF给出的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。
为了让使用者使用时不暴露内部细节,List等集合类必须自己封装一套访问提供给访问者,这套访问机制称为iterator,因此iteraotr必须由数据提供者进行实现。
本文以java中ArrayList的实现为例进行讲解,本文重点讲述iterator的实现思想,其余省略。
废话少说,上类图,ArrayList和Iterator的相关类图如下:
类图解析:
Iterator为一个接口,只定义了三个方法,hasNext(),next(),和remove()。
Collection接口继承Iterable接口,提供了一个iterator()方法,使得Collection子类通过iterator()方法获取Collection内部实现的Iterator对象。
ArrayList的内部具体实现iterator()方法,提供一个ListIterator的对象,由ArrayList实现
上文得知,iterator具体实现必须在ArrayList本身中实现,ArrayList实现的是一个ListIterator,实现部分代码如下:
public class ArrayList { /** other .... */ public Iterator<E> iterator(){ return listIterator(); } public ListIterator<E> listIterator () return new ListIterator<E>(){ /* 具体实现 */ public boolean hasNext(){/* ... */ } public E next(){/* ... */} public remove(){/* ... */} } } }
Iterator和List的remove
在List和iterator中都有remove这个方法,有什么区别看看定义:
Iterator:remove()
Removes from the underlying collection thelast element returned by this iterator (optional operation).
ArrayList的remove
remove(int index)
Removes theelement at the specified position in this list (optional operation).
从参数就能看出差别,iterator删除最后一个迭代过的元素,而List中则按照index进行删除,对ArrayList,每次删除一个元素都要进行移动,因此效率不高,下面是remove的代码片段。
public class ArrayList { /** other .... */ public Iterator<E> iterator(){ return listIterator(); } public ListIterator<E> listIterator () return new ListIterator<E>(){ /* 具体实现 */ public boolean hasNext(){/* ... */ } public E next(){/* ... */} public remove(){/* ... */} } } }
在使用集合类时,可以使用iterator进行遍历,不同的Collection实现有着不同的iterator,比如List中的iterator返回的ListIterator就有previous()等方法。