Изтриване на елемент от списъка в foreach цикъл не хвърлят concurrentmodificationexception, защо стека
Въпросът е по-скоро теоретичен, но все пак. Да кажем, че имам ArrayList.
И аз искам да го премахнете от всички номера по-големи от 10.
"Точно така", това може да бъде направено чрез итератор да получи гарантиран резултат.
Но за моя изненада, работи правилно и опцията
Въпреки факта, че всички се посочва, че всеки опит да се отстранят от колекцията в една линия, без да използвате итератор води до ConcurrentModificationException.
И наистина, ако се отстранят със сигурност да получите само ConcurrentModificationException
Всъщност, може ли някой да обясни магия или даде съвет, където можете да прочетете по този въпрос?
Явно сте невероятно щастлив:
- не сте имали елементите, чиято стойност е повече от 10
- Имам елемент, чиято стойност е повече от 10, но това е само един и е бил поставен в предпоследното място в списъка
Нека да разгледаме работата по кратък пример.
Ние добавихме три числа. Така че, как foreach
- Той получава итератор.
Проверки за следващия член hasNext ().
Ако тя се връща истина. След това отнема на следващия елемент с следващата ().
Освен това повторете стъпки 2 и 3, докато hasNext () връща лъжа.
Ако изтриете елемент от списъка, размерът му е намалена и modCount увеличение.
Ако изтриете елемент от итерация, той ще бъде хвърлен ConcurrentModificationException modCount изключение на ред! = ExpectedModCount.
Но какво се случва, ако изтриете предпоследната позиция?
Когато премахнете стойност 22, размерът се намалява до 2.
В други случаи той ще бъде хвърлен ConcurrentModificationException поради modCount! = ExpectedModCount.
И в този случай, една единствена проверка, за да се проведе, за да развесели ..
Това е магията. Или бъг.