Chúng ta đều biết rằng cách an toàn nhất "và có lẽ chỉ an toàn" để loại bỏ một đối tượng khỏi bộ sưu tập trong khi lặp lại nó, trước tiên là lấy Iterator
, thực hiện vòng lặp và xóa khi cần;Cách thức loại bỏ của Iterator thực sự loại bỏ một đối tượng
Iterator iter=Collection.iterator();
while(iter.hasNext()){
Object o=iter.next()
if(o.equals(what i'm looking for)){
iter.remove();
}
}
Những gì tôi muốn hiểu, và tiếc là đã không tìm thấy một lời giải thích kỹ thuật sâu sắc về, là làm thế nào loại bỏ này được thực hiện,
Nếu:
for(Object o:myCollection().getObjects()){
if(o.equals(what i'm looking for)){
myCollection.remove(o);
}
}
sẽ ném một ConcurrentModificationException
, những gì có "trong thuật ngữ kỹ thuật" Iterator.remove()
làm gì? Liệu nó loại bỏ các đối tượng, phá vỡ vòng lặp và khởi động lại vòng lặp?
tôi thấy trong các tài liệu chính thức:
"Loại bỏ các yếu tố hiện Ném
IllegalStateException
nếu một nỗ lực được thực hiện để gọiremove()
mà không được đi trước bởi một cuộc gọi đến tiếp theo().."
Phần "xóa phần tử hiện tại", làm cho tôi nghĩ về tình huống tương tự xảy ra trong vòng lặp "thông thường" = (thực hiện kiểm tra bình đẳng và xóa nếu cần), nhưng tại sao vòng lặp Iterator ConcurrentModification- an toàn?
bạn có thể xem cho chính mình: https://gist.github.com/kibotu/e480bd7505615a7311a6 –