2011-09-10 27 views
8

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?

+1

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

Trả lời

11

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 trong nội bộ Mặc dù khi tôi thực hiện dưới mã nó hoạt động tốt

Có, đó là đúng. Hãy xem mã đã biên dịch, với lệnh javap để xác minh điều này nếu bạn muốn.

tôi đoán là thay đổi có nghĩa là ở đây loại bỏ hoặc bổ sung không cho updation của 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? Atleast các chương trình tôi đã thử nó là trường hợp với họ.

Thats đúng, nếu bạn làm emp1.setEmpId(2) hoặc gì đó tương tự, lặp sẽ không thất bại.

... nên bỏ ngoại lệ sửa đổi đồng thời nhưng không. Không chắc chắn lý do tại sao?

Nó chỉ ném ngoại lệ nếu bạn sửa đổi danh sách. Hãy nhớ rằng danh sách có chứa các tham chiếu đến các đối tượng. Nếu bạn sửa đổi các đối tượng, các tham chiếu không thay đổi, do đó danh sách không thay đổi.

+0

Hi aioobe bạn có thể nhìn vào phần được chỉnh sửa không? –

+0

Làm rõ câu trả lời của tôi. – aioobe

2

Trừ khi nó được truy cập bởi hai luồng khác nhau, không có nguy hiểm khi sửa đổi các phần tử trong danh sách. của bạn không ném concurrent modification exception bởi vì bạn đang sửa đổi các phần tử của tập hợp, không phải là tập hợp chính nó.

Các vấn đề liên quan