1. 程式人生 > 其它 >Java學習筆記121——併發修改異常

Java學習筆記121——併發修改異常

併發修改異常

需求

現在有一個集合,集合中有些字串的元素,我想判斷一下里面有沒有"bigdata"這個字串 ​ 如果有,我們就新增一個"yes"

ConcurrentModificationException:併發修改異常 ​ 當不允許這樣的修改時,可以通過檢測到物件的併發修改的方法來丟擲此異常。

原因

迭代器是依賴於集合存在的,在遍歷迭代器元素的時候,當我們判斷成功後,,往集合 ​ 中添加了一個元素,但是呢,迭代器這個時候並不知道已經添加了元素,所以就報錯了。

簡單描述為:在迭代器遍歷的時候,不能通過集合去修改元素。

解決辦法

1、迭代器遍歷,迭代器修改

​ 2、集合遍歷,集合修改

public class ListQuestion {
  public static void main(String[] args) {
    //建立一個集合物件
    List list = new ArrayList();
​
    list.add("hello");
    list.add("world");
    list.add("java");
    list.add("bigdata");
    list.add("hadoop");
​
    //獲取迭代器物件
//     Iterator iterator = list.iterator();
​
//     while (iterator.hasNext()){
//       String s = (String) iterator.next();
//       if("bigdata".equals(s)){
//         list.add("yes");
//       }
//     }
​
    //迭代器遍歷,迭代器修改
    //因為iterator沒有add方法,但是list特有的集合ListIterator裡面有add方法
//     ListIterator listIterator = list.listIterator();//因為iterator沒有add方法,但是list特有的集合ListIterator還有特有的
//     while (listIterator.hasNext()){
//       String s = (String) listIterator.next();
//       if("bigdata".equals(s)){
//         listIterator.add("yes"); //在迭代器元素"bigdata"後面新增
//       }
//     }
​
    //集合遍歷,集合修改
    for(int i=0;i<list.size();i++){
      String s = (String) list.get(i);
      if("bigdata".equals(s)){
        list.add("yes"); //在集合尾部新增
       }
     }
    System.out.println(list);
   }
}