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;
}