Tôi tìm thấy câu lệnh này nếu một chuỗi sửa đổi một bộ sưu tập trực tiếp trong khi nó đang lặp qua bộ sưu tập với một trình lặp không nhanh, trình vòng lặp sẽ ném ngoại lệ này. tại http://download.oracle.com/javase/6/docs/api/java/util/ConcurrentModificationException.html.Các khái niệm về sửa đổi phần tử trong bộ sưu tập khi đang lặp?
tôi thấy đồng thời sửa đổi thậm chí còn ném vào mã dưới đây
List<Employee> lista= new ArrayList();
Employee emp1=new Employee();
Employee emp2=new Employee();
Employee emp3=new Employee();
lista.add(emp1);
lista.add(emp2);
lista.add(emp3);
for(Employee emp:lista)
{
emp2.setEmpId(2);
lista.remove(emp2);
}
Question1: - Vì vậy, tôi có thể nói tăng cường cho vòng lặp cũng sử dụng iterator thất bại nhanh Mặc dù trong nội bộ khi tôi thực hiện mã dưới đây nó hoạt động? tốt
for(int i=0;i<lista.size();i++)
{
Employee empTemp=lista.get(i);
lista.remove(emp2);
}
question2: - câu hỏi khác là khi tuyên bố nói
nếu a thread sửa đổi một một bộ sưu tập
đoán của tôi là thay đổi có nghĩa là ở đây loại bỏ hoặc bổ sung không cho cập nhật các yếu tố bên trong bộ sưu tập cho giao diện danh sách trong khi nó cũng bao gồm sửa đổi của nguyên tố cho giao diện thiết lập. Đúng? Ít nhất là các chương trình tôi đã thử nó là trường hợp với họ.
Sửa
bộ Về tôi nghi ngờ tuyên bố trên của tôi tức là nó ném đồng thời sửa đổi ngoại lệ khi chúng tôi cố gắng để thay đổi thiết lập trong khi iterating.I cố bên dưới mã nhưng nó không ném bất kỳ ngoại lệ
HashSet<Employee> set1= new HashSet();
Employee emp4=new Employee();
Employee emp5=new Employee();
Employee emp6=new Employee();
set1.add(emp4);
set1.add(emp5);
set1.add(emp6);
Iterator iter1=set1.iterator();
while(iter1.hasNext())
{
Employee emp12=(Employee)iter1.next();
System.out.println("");
emp5.setEmpId(2);
}
Lý tưởng nhất là theo câu lệnh nếu tập hợp được sửa đổi bất kỳ lúc nào sau khi trình vòng lặp được tạo tại http://download.oracle.com/javase/6/docs/api/java/util/HashSet.html, nó sẽ ném ngoại lệ sửa đổi đồng thời nhưng không. Không chắc chắn lý do tại sao?
Giới thiệu về ví dụ của bạn tại Câu hỏi 1: "Mặc dù khi tôi thực thi mã bên dưới, nó hoạt động tốt" Mã của bạn không tốt, nó rất yếu. Nếu bạn thêm/xóa các phần tử trong một vòng lặp được lập chỉ mục, bạn sẽ bỏ qua một số phần tử hoặc xử lý các phần tử khác hai lần. Đó là một điều khá tốt mà các iterator ném một ngoại lệ khi bạn sửa đổi một bộ sưu tập. – toto2