迭代器的簡單使用
在遍歷容器時,我們可以使用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繼承。
那我們如何使用迭代器呢?
示例代碼如下,關鍵代碼的解釋說明已經在注釋部分給出,將不再做贅述。
?
示例代碼:
1 /** 2 3 * + VX:java8733 獲取更多資源 4 5 */ 6 7 public class TestIterator { 8 9 10 11 public static void main(String[] args) { 12 13 List<String> list= new ArrayList(); 14 15 list.add("and"); 16 17 list.add("try"); 18 19 list.add("your"); 20 21 list.add("best"); 22 23 24 25 //使用迭代器,對集合Arraylist中的元素進行取出 26 27 //調用集合的方法iterator() 獲取Iterator接口的實現類對象() 28 29 Iterator<String> it=list.iterator(); 30 31 System.out.println(list.iterator().getClass());//打印的內容是 class java.util.ArrayList$Itr 既是我們的接口的實現類對象 32 33 //接口實現類對象,調用方法hasNext()判斷集合中是否有元素 34 35 boolean b = it.hasNext(); 36 37 System.out.println(b); 38 39 //接口的實現類對象,調用方法next()取出集合中的元素 40 41 String s = it.next(); 42 43 System.out.println("it.next()"+s); 44 45 while(it.hasNext()){ 46 47 /* 48 49 * 這里將不會輸出"and",因為我們調用一次hasNext,內部的指針就會指向下一個元素 50 51 */ 52 53 System.out.println(it.next()); 54 55 } 56 57 58 59 } 60 61 62 63 } 64 65
?
會遇到的問題(并發修改異常)?
我們來設想如下的場景: 在list集合迭代元素中,對元素進行判斷,一旦條件滿足就添加一個新元素。代碼如下
1 /** 2 3 * + VX:java8733 獲取更多資源 4 5 */ 6 7 8 9 List<String> list2 = new ArrayList<String>(); 10 11 list2.add("abc"); 12 13 list2.add("def"); 14 15 list2.add("g"); 16 17 18 19 Iterator<String> it=list2.iterator(); 20 21 while(it.hasNext()){ 22 23 String str=it.next(); 24 25 if("g".equals(str)){ 26 27 //該操作會導致程序異常: ConcurrentModificationException 28 29 List2.add("b"); 30 31 } 32 33 } 34 35 System.out.println(list2);
?
這是為什么呢?我們會發現當我們使用迭代器遍歷元素的時候,?使用了集合方法修改了集合的長度,這是不允許的。程序拋出異常ConcurrentModificationException,這個異常指的是當方法檢測到對象的并發修改,但不允許這種修改時,就會拋出此異常。
????? 迭代器是依賴于集合而存在的,在判斷成功后,集合的中新添加了元素,而迭代器卻不知道,所以就報錯了,這個錯叫并發修改異常。
那我們應該如何解決呢?
首先,在迭代時,盡量不要使用集合的方法操作元素。如果要在迭代時對元素操作。我們可以通過ListIterator迭代器來操作元素。
將上面的代碼做如下的修改:
?
?
1 /** 2 3 * + VX:java8733 獲取更多資源 4 5 */ 6 7 8 9 ListIterator<String> it=list2.listIterator(); 10 11 while(it.hasNext()){ 12 13 String str=it.next(); 14 15 if("a".equals(str)){ 16 17 //子接口ListIterator包含add()方法 18 19 it.add("b"); 20 21 } 22 23 }
?
??