迭代器的简单应用实践
迭代器(iterator)有時又稱游標(cursor)是程序設計的軟件設計模式,可在容器(container,例如鏈表或陣列)上遍訪的接口,設計人員無需關心容器的內容。
在遍歷容器時,我們可以使用for循環或者是增強for循環,但是不同的集合結構在遍歷時,我們要針對集合特點采取不同的方式,比如List是鏈表,我們可以直接當做數組處理,但Map是Key—Value的形式,我們只有獲取了鍵名才能去遍歷集合內容。
很麻煩對吧?
還好JDK為我們提供了一個接口-------Iterator(迭代器),迭代器為各種容器提供了公共的操作接口。這樣使得對容器的遍歷操作與其具體的底層實現相隔離,達到解耦的效果。
查看Iterator的API我們得知,該接口共有3個方法:
查看API發現Collection實現了該接口,也就是說Collection的所有子實現類可使用Iterator的方法,同時在Collection中定義了一個方法iterator()
使用該方法iterator(),要求容器返回一個Iterator對象。第一次調用Iterator的next()方法時,它返回序列的第一個元素。注意:iterator()方法是java.lang.Iterable接口,被Collection繼承。
那我們如何使用迭代器呢?
示例代碼如下,關鍵代碼的解釋說明已經在注釋部分給出,將不再做贅述。
示例代碼:
/*** + 上海尚學堂 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集合迭代元素中,對元素進行判斷,一旦條件滿足就添加一個新元素。代碼如下
我們會發現當我們使用迭代器遍歷元素的時候,通過集合是不能修改元素的。程序拋出異常ConcurrentModificationException,這個異常指的是當方法檢測到對象的并發修改,但不允許這種修改時,就會拋出此異常。
這是為什么呢? 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技術文章陸續奉上,請多關注
總結
以上是生活随笔為你收集整理的迭代器的简单应用实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 无线电波的入侵第1部分——无线电频率基础
- 下一篇: sendBroadcast和sendSt