Iterator原理

shuaishuai3409發表於2016-08-15

Iterator用於遍歷集合中的元素,適用於不知道集合內部結構的情況。使用者不再與集合類互動,而是與Iterator互動,其清楚知道集合類的內部狀態,通過控制iterator達到遍歷集合的目的。

public static void iteratorDemo(){
    List<String> list=new ArrayList<String>();
    list.add("xiaoming");
    list.add("zhongji");
    Iterator it=list.iterator();
    while(it.hasNext()){
    String str=it.next();
    system.out.println(str);
    }
}

1 java API中Iterator介面

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

其中:
hasnext()是判斷語句,表示集合中元素是否遍歷完
next()相當於指標,返回Object物件,需要強轉為需要的型別
remove()刪除集合中元素,不常用。

注意:next()是從前往後遍歷,若想向前遍歷,可以使用繼承Iterator介面的ListIterator介面,其含有E previous()方法,可以向前遍歷集合元素。但要注意只有List可以使用ListIterator介面(連結串列迭代器),只有其含有ListIterator()方便,返回ListIterator<E>物件。


2 迭代器的實現原理
通過上述的分析可知迭代器是取出集合元素的方式。我們知道一個規則想去訪問另一個規則中的方法,可以用內部類。如下圖:
這裡寫圖片描述

Collection是集合頂層介面,含有兩個子介面List和Set,然後又有分別實現介面的類。通過檢視jdk原始碼,每個集合類內部都含有Iterator<E> iterator()方法,該方法是返回集合中迭代器物件。獲取迭代器物件後,就可以使用hasNext、next方法操作集合中的元素了(遍歷)。如果仔細分析下,不難得出如下結論:

每個集合類內部都含有一個內部類,用來實現Iterator介面。集合類的iterator方法就是在獲取內部類物件(迭代器物件),然後通過該物件呼叫hashNext和next方法實現遍歷。


3 下面以ArrayList原始碼分析jdk中如何實現Iterator

class ArrayList{
    public Iterator<E> iterator(){return new Itr();}
    class Itr implements Iterator{
        public hasNext(){……}//重寫這兩個方法,實現元素遍歷
        public next(){……}
    }
}

通過內部類,我們才可以使用諸如list.iterator().hasNext()這樣的方法。


不過在分析HashSet時,沒有找到內部類,進行重寫hasNext、next方法,這個就不知道具體原因了,希望大家能給予解答。

相關文章