Middle
Жыйымга арналган инстанцияланган итератор collection.remove() ыкмасын чакырганда кандай болот?
sobes.tech AI
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);
}
}