當我們在程序上面運行時,只要修改了ArrayList
就會得到java.util.ConcurrentModificationException
。發生這種情況是因爲ArrayList
迭代器在設計上是快速失效的。這意味着一旦創建了迭代器,如果修改了ArrayList
,則會拋出ConcurrentModificationException
。CopyOnArrayList併發修改
public class ConcurrentListExample {
public void someMethod() {
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
// get the iterator
Iterator<String> it = list.iterator();
//manipulate list while iterating
while (it.hasNext()) {
String str = it.next();
System.out.println(str);
if (str.equals("2")) {
list.remove("5");
}
if (str.equals("3")) {
list.add("3 found");
}
if(str.equals("4")) {
list.set(1, "4");
}
}
}
}
,但如果我們採取Employee
類:
public class Test {
public static void main(String[] args) {
List al = new ArrayList();
Employee ee = new Employee(1, "anoj");
Employee ee1 = new Employee(2, "hai");
al.add(ee);
al.add(ee1);
Iterator it = al.iterator();
while (it.hasNext()) {
Employee hh = (Employee)it.next();
if (hh.getName().equals("anoj")) {
al.remove(0);
System.out.println(al);
}
}
}
}
我沒有得到一個ConcurrentModificationException
。
其正確的「你應該添加或刪除的對象,而迭代。 – Sarma
能否請您修正格式?很難看到發生了什麼事情在這個代碼。在第一個塊,請降低縮進級別,使其不揚長而去屏幕的右側。而在第二塊,請加縮進合適的。這將使人們更容易閱讀你的問題,並給出答案。 – yshavit
什麼是真正的問題在這裏? –