zoukankan      html  css  js  c++  java
  • 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有索引。

  • 相关阅读:
    mysql workbench 建表时PK, NN, UQ, BIN, UN, ZF, AI
    Asan检测内存读越界
    C 实现 C++ 的面向对象特性(封装、继承、多态)
    VIBE算法
    Go 大坑 nil
    求二叉树中节点的最大距离
    计算[1,N]范围内含有7的数字的个数
    一组便于创建线程和线程池的简单封装函数
    用C#执行doc命令
    可以自由停靠的窗体!
  • 原文地址:https://www.cnblogs.com/evilliu/p/7837895.html
Copyright © 2011-2022 走看看