Add on of previous description:
While using an Iterator or its subclass ListIterator, the original Collection is not supposed to be modified; otherwise, a ConcurrentModificationException will be thrown.
Conceptually, if the origianl Collection has been changed, it will mess up the order of the Iterator.
When we have a Collection, an Iterator is like to set up a pointer on the top of it. Instead of copying the original Collection elements, it just virtually puts a pointer on the top of the first element.
Then by calling next(), the pointer moves forward. Forward means it can only move one direction toward the end of the Collection.
However, if it's a List instead of a Set, one can call listiterator() which will give u a bi=directional Iterator. Then previous() method is added in addition to next().
To ensure not to hit outside of the Collection, hasNext() and hasPreviouse() are provided to Iterator interface.