1. 程式人生 > >Iterator和ListIterator區別

Iterator和ListIterator區別

我們在使用List,Set的時候,為了實現對其資料的遍歷,我們經常使用到了Iterator(迭代器)。使用迭代器,你不需要干涉其遍歷的過程,只需要每次取出一個你想要的資料進行處理就可以了。

但是在使用的時候也是有不同的。List和Set都有iterator()來取得其迭代器。對List來說,你也可以通過listIterator()取得其迭代器,兩種迭代器在有些時候是不能通用的,Iterator和ListIterator主要區別在以下方面:

1. ListIterator有add()方法,可以向List中新增物件,而Iterator不能

2. ListIterator和Iterator都有hasNext()和next()方法,可以實現順序向後遍歷,但是ListIterator有hasPrevious()和previous()方法,可以實現逆向(順序向前)遍歷。Iterator就不可以。

3. ListIterator可以定位當前的索引位置,nextIndex()和previousIndex()可以實現。Iterator沒有此功能。

4. 都可實現刪除物件,但是ListIterator可以實現物件的修改,set()方法可以實現。Iierator僅能遍歷,不能修改。

因為ListIterator的這些功能,可以實現對LinkedList等List資料結構的操作。其實,陣列物件也可以用迭代器來實現。

複製程式碼
 1 import java.util.LinkedList;
 2 import java.util.List;
 3 import java.util.ListIterator;
 4 public class TestListIterator
 5 {
 6  public static void main(String args[])
 7  {
 8   TestListIterator tliterator=new TestListIterator();
 9   List<String> list=new LinkedList<String>();
10   tliterator.initial(list);//
初始化這個連結表 11 ListIterator<String> li=list.listIterator();//將該連結錶轉化為ListIterator 12 //下面的程式碼進行ListIterator物件li的各種功能檢測 13 //順序輸出迭代器中的元素 14 while(li.hasNext()) 15 {System.out.print(li.next().toString()+" ");} 16 //驗證add方法,給li新增兩個元素 17 li.add("元素五"); 18 li.add("元素六"); 19 System.out.println();//
產生換行操作 20 //通過使用ListIterator的特有方法hasPrevious與previous實現List的元素 21 //逆序輸出 22 for(String str;li.hasPrevious();) 23 {System.out.print(li.previous().toString()+" ");} 24 System.out.println();//產生換行操作 25 //順序輸出li迭代器中現有的元素 26 while(li.hasNext()) 27 {System.out.print(li.next().toString()+" ");} 28 System.out.println();//產生換行操作 29 //通過使用ListIterator的set方法來改變li中的元素 30 for(String str;li.hasPrevious();) 31 { 32 str=li.previous().toString(); 33 li.set(str.replaceAll("元素","元素編號")); 34 } 35 //順序輸出li迭代器中現有的元素 36 while(li.hasNext()) 37 {System.out.print(li.next().toString()+" ");} 38 39 } 40 //初始化List方法 41 public void initial(List<String> list) 42 { 43 list.add("元素一"); 44 list.add("元素二"); 45 list.add("元素三"); 46 list.add("元素四"); 47 } 48 }
複製程式碼    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,向它傳送"向前","向後","取當前元素"的命令,就可以間接遍歷整個集合。