迭代器Iterator原始碼分析

2021-09-07 23:27:59 字數 1964 閱讀 5248

我們在遍歷乙個集合物件時經常會使用到迭代器iterator,它提供給我們獲取、刪除集合中元素的功能。iterator包含三個方法,分別是:

1、hasnext(),用於判斷迭代器是否已從頭到尾將集合遍歷了一遍,後面是否還有元素。

2、next(),用於獲取當前指向的元素。

3、remove(),刪除剛剛訪問過的元素。

接下來簡單講一下iterator與抽象類abstractlist,介面list、collection的關係,介面collection繼承了介面iterable,從而覆蓋了iterable介面中的方法iterator(),而介面list繼承了collection,接著abstractlist抽象類實現了介面list,我們看看abstractlist類中對方法iterator()的定義:

public iteratoriterator()
該方法返回了乙個itr物件,我們看看該內部類的具體內容。

private class itr implements iterator

public e next() catch (indexoutofbound***ception e)

} public void remove() catch (indexoutofbound***ception e)

} final void checkforcomodification()

}

itr類實現了介面iterator,對hasnext(),next(),remove()三個方法進行了定義,首先來看看類的三個屬性。

用於記錄當前迭代器遍歷到的位置,通過該屬性訪問元素

int cursor = 0;

該屬性用於記錄上一次使用next()方法時遍歷所在的位置,在呼叫remove方法後該屬性值變回-1

int lastret = -1;

modcount是arraylist的屬性,用於記錄對集合進行操作的次數,包括add、remove等方法.

expectedmodcount的應用是為了實現一種」快速失敗"機制,即在使用迭代器的過程中如果對

原集合(如arraylist)進行了修改,此時modcount的值將會發生變化,二者不再相同,

此時將會丟擲併發修改異常。concurrentmodificationexception

int expectedmodcount = modcount;

理解了幾個屬性之後我們再來看看三個方法:

1、hasnext()

public boolean hasnext()
呼叫集合的size()方法,返回集合大小,通過將現階段訪問位置與集合大小進行對比判斷迭代器後面是否還有可遍歷的元素。

2、next()

public e next()  catch (indexoutofbound***ception e) 

}

首先判斷是否發生併發修改異常,不是的話就呼叫get方法獲取cursor指向位置的值,將cursor賦值給lastret,cursor自動加1.返回獲取到的物件。

3、remove()

public void remove()  catch (indexoutofbound***ception e) 

}

該方法首先判斷lastret的值,如果等於-1,表示剛剛進行了刪除操作,此時丟擲不合法狀態異常,接著再判斷是否丟擲併發修改異常,如果不,則呼叫集合的remove方法對lastret指向位置的集合元素進行刪除,再判斷lastret是否小於cursor,因為集合進行了刪除操作,元素位置發生了變化,這一步是為了通過改變cursor的值改變迭代器指向的位置。同時,lastret值設為-1,表示剛剛進行了刪除操作,expectedmodcount屬性的值也進行修改,等於 modcount,以防丟擲同步修改異常。

迭代器模式(Iterator)

迭代器模式 iterator 提供一種方法順序訪問乙個聚合物件中的各種元素,而又不暴露該物件的內部表示。當你需要訪問乙個聚合物件,而且不管這些物件是什麼都需要遍歷的時候,就應該考慮使用迭代器模式。另外,當需要對聚集有多種方式遍歷時,可以考慮去使用迭代器模式。迭代器模式為遍歷不同的聚集結構提供如開始 ...

迭代器模式(Iterator)

1.目的 當需要遍歷 單種方式或多種方式 遍歷乙個組合物件時,使用遍歷模式。該模式類似與將容器的介面進行封裝,不對外直接暴露容器的介面的做法類似。2.ifndef iterator h define iterator h include include using namespace std cla...

Iterator 迭代器模式

現在有乙個集合。其內部元素的儲存方式可能比較複雜。為了讓使用者在不用關心其內部表示的情況下對其元素進行訪問,於是建立了乙個迭代器用於對集合的各個元素進行訪問。為了給使用者提供乙個更友好且強大的介面類,於是對迭代器以組合的形式進行封裝,得到乙個管理類。使用者直接操作該管理類即可得到指定元素,或通過管理...