List集合和iterator并发异常处理

一:List接口:

子类:ArrayList   LinkedList

特点:Unlike sets, lists typically allow duplicate elements.不像set集合,List集合允许元素重复。

          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()比较。

也就是说之前Collection的方法,我们可以用精确的索引来操作。

 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并发异常处理:

看如下代码:

 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 }

报如下的错误:

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有索引。

原文地址:https://www.cnblogs.com/evilliu/p/7837895.html