]Iterator原始碼探究及其與Collection類的關係

逸卿發表於2014-04-15
今天在試寫mapreduce程式的時候,漏寫一句話,造成死迴圈,接著造成mapreduce任務pending
原因非常簡單,在使用iterator的時候,漏掉了next()動作,

int sum = 0;

              while (values.hasNext()) {

                sum = sum + 1;

              }

 values.hasNext()始終為真,因為漏了next()方法,應該是遍歷的下標沒有往前移動,導致hasNext()始終返回真。正好週末,想看一下iterator的原始碼一探究竟。Iterator具體實現是什麼?與Colletion的關係是怎樣的?

Iterator是幾種常見集合資料結構都有的介面。

每一種集合類返回的Iterator具體型別可能不同,Array可能返回ArrayIterator,Set可能返回SetIterator,Tree可能返回TreeIterator,但是它們都實現了Iterator介面,因此,客戶端不關心到底是哪種Iterator,它只需要獲得這個Iterator介面即可


首先

public interface Collection<E> extends Iterable<E>

而Iterable:

public interface Iterable<T> {

 

   

    Iterator<T> iterator();

} 

由此保證所有繼承了Collection的類都有Iterator介面。可以override實現具有自己特徵的Iterator。


下面以ArrayList為例:

[Java]Iterator原始碼探究及其與Collection類的關係
上圖是ArrayList的類繼承關係圖

其中AbstractCllection  implements Collection介面:

public abstract class AbstractCollection<E> implements Collection<E>

從而AbstarctList擁有Iterator方法

在AbstractList中Iterator方法實現為:

 

    public Iterator<E> iterator() {

return new Itr();

    }

還有一個ListIterator  我理解是增強型的Itr  能提供向前向後兩種方向的遍歷

    public ListIterator<E> listIterator() {

return listIterator(0);

    }

Iterator方法實現其實是建立一個Itr類的例項

Itr類和listItr都是AbstractList的內部類

private class Itr implements Iterator<E>

Itr中實現了Iterator介面的 各個方法

比如

 

public boolean hasNext() {

            return cursor != size();

}

其中cursor是int型 表示下標  明顯hasNext不改變下標位置 



另外還看了其他集合類實現Iterator的方式,和ArrayList大同小異,如ArrayBlockingQueue實現的iterator

繼承關係:

[Java]Iterator原始碼探究及其與Collection類的關係
實現:

[Java]Iterator原始碼探究及其與Collection類的關係

可以發現實現方式也是返回一個Itr例項

Itr也是ArrayBlockingQueue的內部類,然後在Itr內部封裝了Iterator介面的各種方法實現。


由此可以看出各個集合類與iterator之間的關係,並且也可以通過原始碼看出哪些迭代器是執行緒間安全的。


相關文章