大數據之路week01--自學之集合_2(列表迭代器 ListIterator)

列表迭代器:java

  ListIterator listerator():List集合特有的迭代器面試

  該迭代器繼承了Iterator迭代器,因此,就能夠直接使用hasNext()和next()方法併發

特有功能:spa

  Object previous();獲取上一個元素code

  boolean hasPrevious():判斷是否有元素對象

  注意:ListIterator能夠實現逆向遍歷,可是必須先正向遍歷,才能逆向遍歷,因此通常無心義,不使用blog

 1 package com.wyh.Iterator;
 2 
 3 import java.util.ArrayList;
 4 import java.util.Iterator;
 5 import java.util.List;
 6 import java.util.ListIterator;
 7 
 8 /** 
 9 * @author WYH
10 * @version 2019年11月9日 下午7:31:41
11 * 
12 * ListIterator : List集合特有的迭代器
13 * 
14 */
15 public class ListIteratorDemo1 {
16     public static void main(String[] args) {
17         //建立集合
18         List i = new ArrayList();
19         
20         //建立字符串對象並將其添加到集合中
21         i.add("王友虎");
22         i.add("李宏燦");
23         i.add("趙以浩");
24         i.add("齊博源");
25         i.add("李先鋒");
26         
27         //ListIterator 繼承了 Iterator,因此能夠用它的實現
28         Iterator it = i.iterator();
29         while(it.hasNext()) {
30             String s = (String)it.next();
31             System.out.println(s);
32         }
33         System.out.println("----------------------");
34 
35         
36         // previous()逆向打印
37         ListIterator list = i.listIterator();
38         /*//若是逆向打印處於第一個位置,輸出爲空
39          * System.out.println("------------逆向打印------------------");
40         while(list.hasPrevious()) {
41             String s3 = (String)list.previous();
42             System.out.println(s3);
43         }*/
44         while(list.hasNext()) {
45             String s2 = (String)list.next();
46             System.out.println(s2);
47         }
48         System.out.println("------------逆向打印------------------");
49         while(list.hasPrevious()) {
50             String s3 = (String)list.previous();
51             System.out.println(s3);
52         }
53         
54         
55         
56     }
57 
58 }


一個十分重要出現問題的點,也是面試常常會問到的點。併發修改錯誤。繼承

問題: 我有一個集合,以下,請問,我想判斷裏面有沒有"李宏燦"這個元素,若是有,我就添加一個元素到集合中,請寫代碼實現。字符串

因而大部分人不知道這個併發修改錯誤的時候,會按照本身的邏輯按照如下代碼實現:get

 1  /*//建立迭代器(Iterator迭代器)(錯誤示範-----------------)
 2         Iterator it = list.iterator();
 3         //找到元素並進行添加張國興
 4         while(it.hasNext()) {
 5             String s = (String)it.next();
 6             if("李宏燦".equals(s)) {
 7                 list.add("123");
 8             }
 9         }
10         System.out.println("list:"+list);*/

結果,咱們發現報錯,但是咱們的邏輯是沒有錯的,那到底錯在哪呢?(報錯:併發修改異常:ConcurrentModificationException

產生的緣由:

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

如何解決呢:

  A: 迭代器迭代元素,迭代器修改元素,咱們使用List集合特有的迭代器:ListIterator listerator()

    結果:元素是跟在剛纔迭代查找到的元素的後面

  B:集合遍歷元素,集合修改元素(普通的for循環實現)

    結果:在末尾進行添加

 

代碼實現:

 1 package com.wyh.Iterator;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 import java.util.ListIterator;
 6 
 7 /** 
 8 * @author WYH
 9 * @version 2019年11月9日 下午7:51:26
10 * 
11 * 併發修改異常:ConcurrentModificationException
12 * 
13 */
14 public class ListIteratorDemo2 {
15     public static void main(String[] args) {
16         //建立集合對象
17         List list = new ArrayList();
18         
19         //建立字符串對象並將其添加到集合中去
20         list.add("王友虎");
21         list.add("李宏燦");
22         list.add("趙以浩");
23         list.add("齊博源");
24         list.add("李先鋒");
25         
26         /*//建立迭代器(Iterator迭代器)(錯誤示範-----------------)
27         Iterator it = list.iterator();
28         //找到元素並進行添加張國興
29         while(it.hasNext()) {
30             String s = (String)it.next();
31             if("李宏燦".equals(s)) {
32                 list.add("123");
33             }
34         }
35         System.out.println("list:"+list);*/
36         
37         //方法1:建立ListIterator迭代器,迭代器調用add方法進行添加
38         ListIterator listt = list.listIterator();
39         while(listt.hasNext()) {
40             String s = (String)listt.next();
41             if("李宏燦".equals(s)) {
42                 listt.add("張國興"); //在找到的元素後面進行添加
43             }
44         }
45         System.out.println("list:"+list);
46         
47         //方法2:利用for循環直接對集合進行遍歷,集合中有添加的方法
48         for(int i = 0;i<list.size();i++) {
49             String s = (String)list.get(i);
50             if(s.equals("李宏燦")) {
51                 list.add("張果喜"); //在末尾進行添加
52             }
53         }
54         System.out.println("list:"+list);
55         
56         
57         
58     }
59 
60 }
相關文章
相關標籤/搜索