Java集合框架之Iterator和ListIterator

1、前言

       迭代器是一個對象,它可讓你遍歷一個容器而且有選擇性的刪除 容器 中的元素,而咱們不須要知道 容器 的內部結構.Java有兩種原生的迭代器:Iterator和ListIterator, 其中 ListIterator繼承自 Iterator.

2、Iterator接口

    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());
    }
}
          Java的 Iterator只能單向移動,它只能用來:
    (1)使用容器的 iterator ()方法返回它的Iterator.Iterator將返回容器的第一個元素.
    (2)使用next()方法返回容器的下一個元素.
    (3)使用hasNext()方法檢查容器中是否還有元素. 若是有,hasNext()方法返回 true.
    (4)使用 remove()方法刪除由 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

3、ListIterator接口

    ListIterator是一個功能更增強大的迭代器, 它只能用於各類List類型的訪問。能夠經過調用listIterator()方法產生一個指向List開始處的ListIterator, 還能夠調用listIterator(n)方法建立一個一開始就指向列表索引爲n的元素處的ListIterator. spa

    ListIterator接口定義以下: code

            代碼清單-3  
public 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]

4、Iterator使用場

    在如下狀況下可使用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集合框架來編寫多態的算法是多麼的簡單.

5、參考資料

                               http://docs.oracle.com/javase/tutorial/collections/interfaces/collection.html

        《Thinking In Java》

相關文章
相關標籤/搜索