迭代器的簡單應用實踐

迭代器(iterator)有時又稱遊標(cursor)是程序設計的軟件設計模式,可在容器(container,例如鏈表或陣列)上遍訪的接口,設計人員無需關心容器的內容。java

在遍歷容器時,咱們可使用for循環或者是加強for循環,可是不一樣的集合結構在遍歷時,咱們要針對集合特色採起不一樣的方式,好比List是鏈表,咱們能夠直接當作數組處理,但Map是Key—Value的形式,咱們只有獲取了鍵名才能去遍歷集合內容。設計模式

很麻煩對吧?
還好JDK爲咱們提供了一個接口-------Iterator(迭代器),迭代器爲各類容器提供了公共的操做接口。這樣使得對容器的遍歷操做與其具體的底層實現相隔離,達到解耦的效果。數組

查看Iterator的API咱們得知,該接口共有3個方法:
圖片描述併發

查看API發現Collection實現了該接口,也就是說Collection的全部子實現類可以使用Iterator的方法,同時在Collection中定義了一個方法iterator()spa

圖片描述

使用該方法iterator(),要求容器返回一個Iterator對象。第一次調用Iterator的next()方法時,它返回序列的第一個元素。注意:iterator()方法是java.lang.Iterable接口,被Collection繼承。
那咱們如何使用迭代器呢?設計

示例代碼以下,關鍵代碼的解釋說明已經在註釋部分給出,將再也不作贅述。指針

示例代碼:code

/**
 * + 上海尚學堂 shsxt.com
 */
public class TestIterator {
    
    public static void main(String[] args) {
        List<String> list= new ArrayList();
        list.add("and");
        list.add("try");
        list.add("your");
        list.add("best");
        
        //使用迭代器,對集合Arraylist中的元素進行取出
        //調用集合的方法iterator() 獲取Iterator接口的實現類對象()
        Iterator<String> it=list.iterator();
        System.out.println(list.iterator().getClass());//打印的內容是 class java.util.ArrayList$Itr 既是咱們的接口的實現類對象
         //接口實現類對象,調用方法hasNext()判斷集合中是否有元素
        boolean b = it.hasNext();
        System.out.println(b);
        //接口的實現類對象,調用方法next()取出集合中的元素
        String s = it.next();
        System.out.println("it.next()"+s);
        while(it.hasNext()){
            /*
             * 這裏將不會輸出"and",由於咱們調用一次hasNext,內部的指針就會指向下一個元素
             */
            System.out.println(it.next());
        }
        
    }
    
}

會遇到的問題(併發修改異常)
咱們來設想以下的場景: 在list集合迭代元素中,對元素進行判斷,一旦條件知足就添加一個新元素。代碼以下對象

/**
 * + VX:java8733 獲取更多資源
 */

    List<String> list2 = new ArrayList<String>();
        list2.add("abc");
        list2.add("def");
        list2.add("g");
        
        Iterator<String> it=list2.iterator();
        while(it.hasNext()){
            String str=it.next();
            if("g".equals(str)){
                //該操做會致使程序異常: ConcurrentModificationException
                List2.add("b");
            }
        }
        System.out.println(list2);

咱們會發現當咱們使用迭代器遍歷元素的時候,經過集合是不能修改元素的。程序拋出異常ConcurrentModificationException,這個異常指的是當方法檢測到對象的併發修改,但不容許這種修改時,就會拋出此異常。blog

這是爲何呢? why?

迭代器是依賴於集合而存在的,在判斷成功後,集合的中新添加了元素,而迭代器殊不知道,因此就報錯了,這個錯叫併發修改異常。

那咱們應該如何解決呢?
首先,在迭代時,儘可能不要使用集合的方法操做元素。若是要在迭代時對元素操做。咱們能夠經過ListIterator迭代器來操做元素。

咱們能夠將上面的代碼作以下的修改就能夠操做list中的元素了

/**
 * 上海尚學堂 shsxt.com
 */

ListIterator<String> it=list2.listIterator();
        while(it.hasNext()){
            String str=it.next();
            if("a".equals(str)){
                //子接口ListIterator包含add()方法
                it.add("b");
            }
        }

上海尚學堂Java原創文章,感謝您閱讀,後續Java技術文章陸續奉上,請多關注

相關文章
相關標籤/搜索