Middle
275
Kuidas käitub kogumiku instantsiiter, kui kutsume välja meetodi collection.remove()?
Vastus AI-lt
sobes.tech AI
Kutsudes collection.remove() iteratsiooni ajal, kasutades initsialiseeritud iteratorit, võib põhjustada ConcurrentModificationException-i.
See juhtub, kuna iterator tavaliselt ei tea, milliseid muudatusi tehakse põhikogumikus otse väljaspool iteratorit. Iterator säilitab sisemise oleku (näiteks, praeguse elemendi indeksi), mis muutub kehtetuks, kui kogumik muudetakse väljaspool iteratori meetodeid (iterator.remove()).
Mõned kogumite rakendused võivad olla "fail-fast" ja spetsiaalselt visata ConcurrentModificationException selliste muudatuste avastamisel, et vältida ettearvamatut käitumist.
Ainsaks ohutuks viisiks kogumi muutmiseks iteratsiooni ajal on kasutada iterator.remove() meetodit.
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class IteratorModificationExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String element = iterator.next();
if ("B".equals(element)) {
// See põhjustab `ConcurrentModificationException`
// list.remove(element);
// Ohutu eemaldamise viis
iterator.remove();
}
}
System.out.println(list);
}
}