Explaintion tại sao nó gây ra ConcurrentModificationException
map.remove(k);
map.put(x, value);
vòng lặp cho mỗi lần cũng tạo nội bộ một trình lặp của entrySet
của map
. Trong khi lặp qua bản đồ bạn đã sửa đổi cấu trúc của bản đồ bằng cách đặt lại giá trị vào bản đồ (map.put(x,value)
) gây ra điều này ConcurrentModificationException
.
Người ta thậm chí cũng giải thích trong documentation -
Các vòng lặp được trả về bởi tất cả các lớp học này "xem bộ sưu tập phương pháp" là thất bại nhanh: nếu bản đồ được cấu trúc biến đổi bất cứ lúc nào sau khi iterator được tạo ra, bằng bất kỳ cách nào ngoại trừ thông qua phương thức xóa riêng của trình lặp của , trình lặp sẽ ném một ConcurrentModificationException.Do đó, khi đối mặt với sửa đổi đồng thời, trình vòng lặp không nhanh chóng và sạch sẽ, thay vì rủi ro hành vi tùy ý, không xác định tại thời điểm chưa xác định trong tương lai.
Làm thế nào để giải quyết việc này -
bạn phải thay đổi sự thay đổi cấu trúc của bản đồ này trong khi lặp lại, bạn có thể chèn các giá trị này sau, như giữ một bản đồ tạm thời và thêm một lần lặp xong mình việc làm.
Map<Long, Integer> tempMap = new HashMap<>();
for (Map.Entry<Long, Integer> e : map.entrySet()){
map.remove(k);
tempMap.put(x, value);
}
map.putApp(tempMap);
Nguồn
2013-05-19 17:10:18
@ZouZou Tôi googled cho điều này và tìm thấy câu hỏi này ngay từ đầu. Google không đủ, nội dung cũng cần :-) – peterh
Bạn có thể đính kèm mã cho trình lặp không. Đoạn mã trên chắc chắn sẽ cung cấp cho bạn một ngoại lệ sửa đổi đồng thời. Bạn đang lặp lại thông qua keyset cũng như sửa đổi bản đồ cùng một lúc. Đây là một công thức cho thảm họa. – SamDJava
Đã thêm câu trả lời dưới đây với mã mẫu. – SamDJava