1. 程式人生 > >黑馬程式設計師-java基礎-併發修改異常產生的原因和解決方案

黑馬程式設計師-java基礎-併發修改異常產生的原因和解決方案

------Java培訓、Android培訓、iOS培訓、.Net培訓、期待與您交流! -------

* 問題?
 * 我有一個集合,如下,請問,我想判斷裡面有沒有"world"這個元素,如果有,我就新增一個"javaee"元素,請寫程式碼實現。
 * 
 * ConcurrentModificationException:當方法檢測到物件的併發修改,但不允許這種修改時,丟擲此異常。 
 * 產生的原因:
 * 迭代器是依賴於集合而存在的,在判斷成功後,集合的中新添加了元素,而迭代器卻不知道,所以就報錯了,這個錯叫併發修改異常。
 * 其實這個問題描述的是:迭代器遍歷元素的時候,通過集合是不能修改元素的。
 * 如何解決呢?
 * A:迭代器迭代元素,迭代器修改元素
 * 元素是跟在剛才迭代的元素後面的。
 * B:集合遍歷元素,集合修改元素(普通for)
 * 元素在最後新增的。

package cn.itcast_04;



import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;



public class ListIteratorDemo2 {
public static void main(String[] args) {
// 建立List集合物件
List list = new ArrayList();
// 新增元素
list.add("hello");
list.add("world");
list.add("java");


// 迭代器遍歷
// Iterator it = list.iterator();
// while (it.hasNext()) {
// String s = (String) it.next();
// if ("world".equals(s)) {
// list.add("javaee");
// }
// }


// 方式1:迭代器迭代元素,迭代器修改元素
// 而Iterator迭代器卻沒有新增功能,所以我們使用其子介面ListIterator
// ListIterator lit = list.listIterator();
// while (lit.hasNext()) {
// String s = (String) lit.next();
// if ("world".equals(s)) {
// lit.add("javaee");
// }
// }


// 方式2:集合遍歷元素,集合修改元素(普通for)
for (int x = 0; x < list.size(); x++) {
String s = (String) list.get(x);
if ("world".equals(s)) {
list.add("javaee");
}
}


System.out.println("list:" + list);
}
}