List集合和iterator併發異常處理

一:List接口:html

子類:ArrayList   LinkedListjava

特色:Unlike sets, lists typically allow duplicate elements.不像set集合,List集合容許元素重複。api

          The List interface provides four methods for positional (indexed) access to list elements. Lists (like Java arrays) are zero based. List集合提供一些關於索引的訪問元素的方法,和數組同樣起始索引:0;數組

           也就是說List集合是存取是有序的。好比存:11,12,13.取元素也是11,12,13.併發

           List集合比對2個對象使用equals()比較。ide

也就是說以前Collection的方法,咱們能夠用精確的索引來操做。spa

 1 package test09;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 public class List_Demo {
 7     public static void main(String...args){
 8         list_test();
 9     }
10     public  static void list_test(){
11         List<Integer> li_te=new ArrayList<>();
12         li_te.add(11);
13         li_te.add(12);
14         li_te.add(13);
15         li_te.add(14);
16         li_te.add(15);
17         li_te.add(0,99);//指定位置添加元素。
18         System.out.print(li_te);
19         li_te.remove(0);//指定位置刪除元素。
20         System.out.print(li_te);
21         Integer get_el=li_te.get(1);
22         System.out.print(get_el);//指定位置獲取元素,若是超出索引報錯誤:IndexOutOfBoundsException
23         li_te.set(0,88);//replace替換指定位置的元素。
24         System.out.print(li_te);
25         for(Integer i=0;i<li_te.size();i++){
26             System.out.print(li_te.get(i));//使用索引進行迭代。
27         }
28     }
29 }

 二:迭代器Iterator併發異常處理:.net

看以下代碼:code

 1 package test09;
 2 
 3 import java.util.ArrayList;
 4 import java.util.Iterator;
 5 import java.util.List;
 6 
 7 public class List_It {
 8     public static void main(String...args){
 9         op_It();
10     }
11     public static void op_It(){
12         List<String> str_list=new ArrayList<>();
13         str_list.add("i");
14         str_list.add("b");
15         str_list.add("n");
16         str_list.add("m");
17         Iterator<String> str_it=str_list.iterator();
18         while (str_it.hasNext()){
19          String test_str=str_it.next();
20          if (test_str.equals("m")){
21              str_list.add("k");
22          }
23         }
24     }
25 }

 

報以下的錯誤:htm

Exception in thread "main" java.util.ConcurrentModificationException

這是爲何呢?

這是由於在咱們使用迭代器Iterator的時候,同時對集合元素進行操做,可是迭代器並不知道集合發生變化,因此拋出如上的錯誤。

解決方法:解決併發引發的錯誤,在迭代的集合元素的時候,不要進行相關的元素操做。

                 或者使用listiterator方法。

    ListIterator<E> listIterator()

將如上的代碼進行修改:

 1 package test09;
 2 
 3 import java.util.ArrayList;
 4 import java.util.Iterator;
 5 import java.util.List;
 6 import java.util.ListIterator;
 7 
 8 public class List_It {
 9     public static void main(String...args){
10         op_It();
11     }
12     public static void op_It(){
13         List<String> str_list=new ArrayList<>();
14         str_list.add("i");
15         str_list.add("b");
16         str_list.add("n");
17         str_list.add("m");
18         ListIterator<String> str_it=str_list.listIterator();
19         while (str_it.hasNext()){
20             if(str_it.next().equals("m")){
21                 str_it.add("222");
22             }
23         }
24         System.out.print(str_list);
25     }
26 }

在迭代的過程當中,若是不想不引發併發異常,能夠使用ListIterator迭代器,在迭代的過程對數組的修改。只有List有這特性,由於List有索引。

相關文章
相關標籤/搜索