How Iterator’s remove method actually remove an object

The reason why you cannot modify a list while iterating over it is because the iterator has to know what to return for hasNext() and next().

How this is done is implementation specific, but you could have a look at the source code of ArrayList/AbstractList/LinkedList etc.

Also note that in some situations you can use some code like this as an alternative:

List<Foo> copyList = new ArrayList<>(origList);
for (Foo foo : copyList){
  if (condition){
    origList.remove(foo);
  }
}

But this code will probably run slightly slower because the collection has to be copied (shallow copy only) and the element to remove has to be searched.

Also note that if you’re using the iterator directly it’s recommended to use a for loop instead of while loop as this limits the scope of the variable:

for (Iterator<Foo> iterator = myCollection.iterator(); iterator.hasNext();){
...
}

Leave a Comment