迭代器(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技術文章陸續奉上,請多關注