1. 程式人生 > >Iterator使用與迭代器設計模式

Iterator使用與迭代器設計模式

Iterator使用

迭代器(Iterator)對應與迭代器設計模式。
Iterator提供三個方法:
hasNext() 判斷是否還有下一個元素
next() 獲取下一個元素
remove() 刪除元素
forEachRemaining() jdk1.8以後新增的方法,可以在動態迭代過程中自定義操作邏輯

子介面

ListIterator:提供了對list的雙向遍歷及add、set方法,但是不支援remove。

主要用途

  1. 對集合進行遍歷獲取元素。
  2. 對集合元素進行刪除,由於元素減少而導致集合長度發生變化的替代方案。見IteratorUsage.iteratorDelete()
  3. forEachRemaining對集合手動迭代,如標記刪除元素,最後一次性刪除,減少arrayList陣列結構刪除元素的效能消耗。見IteratorUsage.iteratorUpdate()
  4. 使用Iterator可以大大加快鏈式儲存的訪問節點的效能,使用for迴圈每次會從頭開始,不具有隨機讀取的能力,但是foreach效率最高

注意

  1. 一個iterator物件只能遍歷使用一次,不能再次使用。
  2. 執行iterator.next()方法後,標記指標已指向下一個,在使用ListIterator做前置插入時,要放在next()之前,或者通過previous返回。
  3. 使用ListIterator應將遊標的指向梳理清楚,特別是在新增或刪除的時候,但是對於arrayList不建議做插入和刪除操作。
  4. ListIterator改值的呼叫順序:next>set>remove>add,否則會丟擲會拋IllegalStateException異常。

使用方面的實驗:https://github.com/challange/JavaStudy/blob/master/BasicUsage/src/com/wwyz/study/collection/IteratorUsage.java

拓展:迭代器設計模式

定義:提供一種方法訪問一個容器(container)物件中各個元素,而又不需暴露該物件的內部細節。

為了讓使用者使用時不暴露內部細節,List等集合類必須自己封裝一套訪問提供給訪問者,這套訪問機制稱為iterator,因此iteraotr必須由資料提供者進行實現。
外部通過呼叫iterator可以完成對元素的遍歷,而不用思考去如何遍歷。

相關閱讀

forEachRemaining中remove可能拋異常