The behavior of an iterator is unspecified if the underlying collection is modified, while the iteration is in progress, in any way other than by calling the remove method. An implementation may nonetheless choose to guarantee that the iterator will fail quickly and cleanly if the underlying collection is structurally modified after the iterator's creation, other than by its own methods. In that case an interator will throw a ConcurrentModificationException . The iterator is then called fail-fast. It is often not difficult to implement fail-fast iterators, e.g. by keeping a record of version numbers, but we shall not generally do so in order to keep code as simple as possible.