一 遇到问题----
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()等操作,这是后话。
二 提出问题------为什么需要iterator?优势?
java集合类
Iterator模式产生背景
在java中的List及其他集合类中需要遍历时,可以采用get()和for进行,但是这样有一个明显的缺点,List本身和对List的访问操作耦合性强,为了使得对List乃至Colletion的操作与数据本身分离,产生了iterator模式。
GOF给出的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。
Iterator模式原理
为了让使用者使用时不暴露内部细节,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与原有方法的对比
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的使用建议
在使用集合类时,可以使用iterator进行遍历,不同的Collection实现有着不同的iterator,比如List中的iterator返回的ListIterator就有previous()等方法。