Middle
261
Коллекция үшін инстанцирленген итератор қалай әрекет етеді, егер collection.remove() әдісі шақырылса?
AI-дан жауап
sobes.tech AI
collection.remove() шақыруын итерация кезінде инстанцияланған итератор арқылы орындау ConcurrentModificationException қатесін тудыруы мүмкін.
Бұл әдетте итератордың негізгі коллекцияда жасалған өзгерістер туралы білмеуінен болады. Итератор ішкі күйін (мысалы, ағымдағы элементтің индексін) сақтайды, ол коллекция өзгертілген кезде жарамсыз болып қалады, егер өзгерістер итератор әдістері (iterator.remove()) арқылы жасалмаса.
Кейбір коллекция жүзеге асырулары "жылдам құлау" (fail-fast) қасиетіне ие және мұндай өзгерістерді анықтағанда ConcurrentModificationException тастайды, бұл күтпеген мінез-құлықты болдырмау үшін.
Коллекцияны итерация кезінде өзгерту үшін жалғыз қауіпсіз әдіс — iterator.remove() әдісін пайдалану.
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)) {
// Бұл `ConcurrentModificationException` тудырады
// list.remove(element);
// Бұл қауіпсіз жою тәсілі
iterator.remove();
}
}
System.out.println(list);
}
}