The remove(int)
method on List
removes the element at the specified position. Before you start your loop, your list looks like this:
[1, 2]
Then you start an iterator on the list:
[1, 2]
^
Your for
loop then removes the element at position 1, which is the number 2:
[1]
^
The iterator, on the next implied hasNext()
call, returns false
, and the loop terminates.
You will get a ConcurrentModificationException
if you add more elements to the list. Then the implicit next()
will throw.
As a note, from the Javadoc for ArrayList
from the JCF:
Note that the fail-fast behavior of an iterator cannot be guaranteed as it is, generally speaking, impossible to make any hard guarantees in the presence of unsynchronized concurrent modification. Fail-fast iterators throw ConcurrentModificationException
on a best-effort basis. Therefore, it would be wrong to write a program that depended on this exception for its correctness: the fail-fast behavior of iterators should be used only to detect bugs.
This is probably actually a bug in the Oracle ArrayList
iterator implementation; hasNext()
does not check for modification:
public boolean hasNext() {
return cursor != size;
}