Iterator 一般被稱爲輕量級對象,由於建立它的開銷比較小.能夠經過調用容器的 iterator()方法來獲取它的Iterator. html
下面是Iterator接口定義: java
代碼清單-1 算法
public interface Iterator<E> { boolean hasNext(); E next(); default void remove() { throw new UnsupportedOperationException("remove"); } default void forEachRemaining(Consumer<? super E> action) { Objects.requireNonNull(action); while (hasNext()) action.accept(next()); } }
下面來看一個使用示例: 安全
代碼清單-2 oracle
public class IteratorExample { public static void main(String[] args) { ArrayList<String> a = new ArrayList<String>(); a.add("aaa"); a.add("bbb"); a.add("ccc"); System.out.println("Before iterate : " + a); Iterator<String> it = a.iterator(); while (it.hasNext()) { String t = it.next(); if ("bbb".equals(t)) { it.remove(); } } System.out.println("After iterate : " + a); } }
輸出結果以下: 框架
Before iterate : [aaa, bbb, ccc] After iterate : [aaa, ccc]
注意:Iterator.remove()是惟一安全的方式來在迭代過程當中修改集合;若是在迭代過程當中以任何其它的方式修改了基本集合將會產生未知的行爲.並且每調用一次next()方法,remove()方法只能被調用一次,若是違反這個規則將拋出一個異常. ui
ListIterator是一個功能更增強大的迭代器, 它只能用於各類List類型的訪問。能夠經過調用listIterator()方法產生一個指向List開始處的ListIterator, 還能夠調用listIterator(n)方法建立一個一開始就指向列表索引爲n的元素處的ListIterator. spa
ListIterator接口定義以下: code
代碼清單-3public interface ListIterator<E> extends Iterator<E> { boolean hasNext(); E next(); boolean hasPrevious(); E previous(); int nextIndex(); int previousIndex(); void remove(); void set(E e); void add(E e); }
由以上定義咱們能夠推出ListIterator能夠: orm
(1)雙向移動.
(2)產生相對於迭代器在列表中指向的當前位置的前一個和後一個元素的索引.
(3)可使用set()方法替換它訪問過的最後一個元素.
(4)可使用add()方法在next()方法返回的元素以前或previous()方法返回的元素以後插入一個元素.
下面就簡單演示全部這些功能:
代碼清單-4
public class ListIteratorExample { public static void main(String[] args) { ArrayList<String> a = new ArrayList<String>(); a.add("aaa"); a.add("bbb"); a.add("ccc"); System.out.println("Before iterate : " + a); ListIterator<String> it = a.listIterator(); while (it.hasNext()) { System.out.println(it.next() + ", " + it.previousIndex() + ", " + it.nextIndex()); } while (it.hasPrevious()) { System.out.print(it.previous() + " "); } System.out.println(); it = a.listIterator(1); while (it.hasNext()) { String t = it.next(); if ("ccc".equals(t)) { it.set("nnn"); } else { it.add("kkk"); } } System.out.println("After iterate : " + a); } }
輸出結果以下:
Before iterate : [aaa, bbb, ccc] aaa, 0, 1 bbb, 1, 2 ccc, 2, 3 ccc bbb aaa After iterate : [aaa, bbb, kkk, nnn]
在如下狀況下可使用Iterator接口代替for-each結構:
(1)刪除當前的元素.for-each結構隱藏了迭代器, 因此你不能調用remove()方法. 所以for-each結構沒法用於過濾.
(2)並行地迭代多個集合.
下面的代碼片斷展現瞭如何使用一個迭代器來過濾任意一個集合——即遍歷這個集合並刪除指定元素.
代碼清單-5
static void filter(Collection<?> c) { for (Iterator<?> it = c.iterator(); it.hasNext(); ) if (!cond(it.next())) it.remove(); }以上代碼是多態的, 意味着它對任何集合都起做用, 而不用去考慮具體的實現.可見使用Java集合框架來編寫多態的算法是多麼的簡單.
http://docs.oracle.com/javase/tutorial/collections/interfaces/collection.html
《Thinking In Java》