Изтриване на елемент от списъка в foreach цикъл не хвърлят concurrentmodificationexception, защо стека

Въпросът е по-скоро теоретичен, но все пак. Да кажем, че имам ArrayList.

И аз искам да го премахнете от всички номера по-големи от 10.

"Точно така", това може да бъде направено чрез итератор да получи гарантиран резултат.

Но за моя изненада, работи правилно и опцията

Въпреки факта, че всички се посочва, че всеки опит да се отстранят от колекцията в една линия, без да използвате итератор води до ConcurrentModificationException.

И наистина, ако се отстранят със сигурност да получите само ConcurrentModificationException

Всъщност, може ли някой да обясни магия или даде съвет, където можете да прочетете по този въпрос?

Явно сте невероятно щастлив:

  • не сте имали елементите, чиято стойност е повече от 10
  • Имам елемент, чиято стойност е повече от 10, но това е само един и е бил поставен в предпоследното място в списъка

Нека да разгледаме работата по кратък пример.

Ние добавихме три числа. Така че, как foreach

  1. Той получава итератор.

Проверки за следващия член hasNext ().

Ако тя се връща истина. След това отнема на следващия елемент с следващата ().

Освен това повторете стъпки 2 и 3, докато hasNext () връща лъжа.

Ако изтриете елемент от списъка, размерът му е намалена и modCount увеличение.

Ако изтриете елемент от итерация, той ще бъде хвърлен ConcurrentModificationException modCount изключение на ред! = ExpectedModCount.

Но какво се случва, ако изтриете предпоследната позиция?

Когато премахнете стойност 22, размерът се намалява до 2.

В други случаи той ще бъде хвърлен ConcurrentModificationException поради modCount! = ExpectedModCount.

И в този случай, една единствена проверка, за да се проведе, за да развесели ..

Това е магията. Или бъг.