Ștergerea unui element din listă într-o buclă foreach nu arunca concurrentmodificationexception, de ce stivă

Întrebarea este mai degrabă teoretică, dar încă. Să presupunem că am un ArrayList.

Și vreau să-l eliminați din toate numerele de mai mult de 10.

„Așa e“, se poate face printr-un iterator pentru a obține un rezultat garantat.

Dar, spre surprinderea mea, funcționează corect și opțiunea

În ciuda faptului că toate statele că orice încercare de a elimina din colecția într-o buclă fără a utiliza un iterator duce la ConcurrentModificationException.

Și, într-adevăr, dacă îndepărtăm cu siguranță obține doar ConcurrentModificationException

De fapt, poate cineva explica magie sau da un sfat, în cazul în care puteți citi pe acest subiect?

Se pare că ai noroc incredibil:

  • nu ai avut elementele a căror valoare a fost mai mult de 10
  • Am element, a cărui valoare a fost mai mare de 10, dar a fost doar una și a fost plasat în penultimul loc în lista

Să ne uităm la lucrările pe un exemplu scurt.

Am adăugat trei numere. Deci, cum se foreach

  1. El devine un iterator.

Controale pentru următorul membru hasNext ().

Dacă se returnează adevărat. apoi ia elementul următor cu next ().

Mai departe repetați pașii 2 și 3 până când hasNext () returnează false.

Dacă ștergeți un element din listă, dimensiunea sa este redusă și creșterea modCount.

Dacă ștergeți un element din iterație, acesta va fi aruncat ConcurrentModificationException modCount excepție pe linia! = ExpectedModCount.

Dar ce se întâmplă dacă ștergeți elementul penultimul?

Când eliminăm valoarea 22, dimensiunea este redusă la 2.

În alte cazuri, acesta va fi aruncat ConcurrentModificationException din cauza modCount! = ExpectedModCount.

Și în acest caz, un singur cec care va avea loc pentru a ridica moralul ..

Asta e magia. Sau un bug.