集合框架(併發修改異常產生的原因及解決方案)
阿新 • • 發佈:2022-03-22
我有一個集合,如下,請問,我想判斷裡面有沒有"world"這個元素,如果有,我就新增一個"javaee"元素,請寫程式碼實現。
1 package cn.itcast_04; 2 3 import java.util.ArrayList; 4 import java.util.Iterator; 5 import java.util.List; 6 import java.util.ListIterator; 7 8 /* 9 * 問題? 10 * 我有一個集合,如下,請問,我想判斷裡面有沒有"world"這個元素,如果有,我就新增一個"javaee"元素,請寫程式碼實現。11 * 12 * ConcurrentModificationException:當方法檢測到物件的併發修改,但不允許這種修改時,丟擲此異常。 13 * 產生的原因: 14 * 迭代器是依賴於集合而存在的,在判斷成功後,集合的中新添加了元素,而迭代器卻不知道,所以就報錯了,這個錯叫併發修改異常。 15 * 其實這個問題描述的是:迭代器遍歷元素的時候,通過集合是不能修改元素的。 16 * 如何解決呢? 17 * A:迭代器迭代元素,迭代器修改元素 18 * 元素是跟在剛才迭代的元素後面的。 19 * B:集合遍歷元素,集合修改元素(普通for)20 * 元素在最後新增的。 21 */ 22 public class ListIteratorDemo2 { 23 public static void main(String[] args) { 24 // 建立List集合物件 25 List list = new ArrayList(); 26 // 新增元素 27 list.add("hello"); 28 list.add("world"); 29 list.add("java"); 30 31 //迭代器遍歷 32 // Iterator it = list.iterator(); 33 // while (it.hasNext()) { 34 // String s = (String) it.next(); 35 // if ("world".equals(s)) { 36 // list.add("javaee"); 37 // } 38 // } 39 40 // 方式1:迭代器迭代元素,迭代器修改元素 41 // 而Iterator迭代器卻沒有新增功能,所以我們使用其子介面ListIterator 42 // ListIterator lit = list.listIterator(); 43 // while (lit.hasNext()) { 44 // String s = (String) lit.next(); 45 // if ("world".equals(s)) { 46 // lit.add("javaee"); 47 // } 48 // } 49 50 // 方式2:集合遍歷元素,集合修改元素(普通for) 51 for (int x = 0; x < list.size(); x++) { 52 String s = (String) list.get(x); 53 if ("world".equals(s)) { 54 list.add("javaee"); 55 } 56 } 57 58 System.out.println("list:" + list); 59 } 60 }
1 package Day15; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 import java.util.ListIterator; 6 7 //問題? 8 // * 9 // 我有一個集合,如下,請問,我想判斷裡面有沒有"world"這個元素, 10 // 如果有,我就新增一個"javaee"元素,請寫程式碼實現。 11 public class BFXG { 12 public static void main(String[] args) { 13 //建立List集合物件 14 List A = new ArrayList(); 15 16 //向集合內新增元素 17 A.add("hello"); 18 A.add("world"); 19 A.add("java"); 20 21 // //方式一 22 // //利用迭代器進行遍歷---並向集合內新增元素 23 // //Iterator迭代器沒有新增功能,所以我們使用Iterator的子類ListIterator進行新增 24 // //利用集合物件建立迭代器物件--listIterator 25 // ListIterator B = A.listIterator(); 26 // //進行迴圈遍歷--利用ListIterator進行遍歷判斷條件為hasNext獲取方法是next 27 // while(B.hasNext()){ 28 // //型別轉換---強制型別轉換為字串型別 29 // String MM = (String)B.next(); 30 // //向集合內新增字元----ListTerator下的新增功能 31 // if("world".equals(MM)){ 32 // B.add("javaee"); 33 // 34 // } 35 // } 36 // System.out.println(A); 37 38 //方式二for迴圈遍歷--集合新增元素 39 //利用集合的長度進行--控制 40 for(int x =0;x<A.size();x++){ 41 //利用List集合中的get()獲取方法來進行元素的獲取--返回列表中指定位置的元素--並進行型別的轉換 42 String MM= (String) A.get(x); 43 //對轉換後的字串進行判斷--利用字串中的equals方法進行兩個字串的判斷 44 if("world".equals(MM)){ 45 //向集合內新增元素 46 A.add("javaee"); 47 48 } 49 } 50 //進行對集合的輸出檢視 51 System.out.println(A); 52 53 } 54 55 }