Tôi có dưới lớp hai javaDanh sách ném ConcurrentModificationException nhưng thiết lập không ném ConcurrentModificationException?
import java.util.*;
public class ArrayListTest032 {
public static void main(String[] ar) {
List<String> list = new ArrayList<String>();
list.add("core java");
list.add("php");
list.add("j2ee");
list.add("struts");
list.add("hibernate");
Iterator<String> itr = list.iterator();
while (itr.hasNext()) {
System.out.println(itr.next());
}
list.remove("php");
while (itr.hasNext()) {
System.out.println(itr.next());
}
}
}
Khi tôi chạy trên mã tôi nhận được bên dưới đầu ra.
core java
php
j2ee
struts
hibernate
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
at java.util.AbstractList$Itr.next(AbstractList.java:343)
at ArrayListTest032.main(ArrayListTest032.java:20)
Điều gì được mong đợi khi tôi sửa đổi danh sách trong khi lặp lại. Nhưng ở bên dưới lớp logic tương tự java được thực hiện bởi nhóm gia đình.
import java.util.*;
public class HashSetTest021 {
public static void main(String[] ar) {
Set<String> set = new HashSet<String>();
set.add("core java");
set.add("php");
set.add("j2ee");
set.add("struts");
set.add("hibernate");
Iterator<String> itr = set.iterator();
while (itr.hasNext()) {
System.out.println(itr.next());
}
set.remove("php");
while (itr.hasNext()) {
System.out.println(itr.next());
}
}
}
Và đặt ra là.
hibernate
core java
j2ee
php
struts
Không có ConcurrentModificationException bất kỳ.
Tôi chỉ muốn biết tại sao cùng một đoạn mã ném ConcurrentModificationException trong trường hợp list
gia đình, nhưng không có bất kỳ ConcurrentModificationException trong trường hợp set
gia đình
+1 cho demo fiddle –
nit: trình lặp ArrayList thực sự kiểm tra số lần sửa đổi, không phải độ dài mỗi lần, vì vậy nếu bạn thêm thì ngay lập tức xóa phần tử, để nguyên độ dài, bạn vẫn sẽ nhận được một ConcurrentModificationException sau đó. –