unfortunately, in the foreach loop, there is no access to the underlying iterator, so iterator.remove() is hidden.
– akfFeb 25 '11 at 2:59

7

Well yes, you wouldn't be able to use the for-each loop, you'd have to switch to using the Iterator.
– Paul BlessingFeb 25 '11 at 3:04

1

@afk, Yes you would have to switch to using an Iterator. Remember the for-each loop is just syntactic sugar. This would be one of the cases where it clearly doesn't make sense to use that syntax.
– Tim BenderFeb 25 '11 at 3:46

iter.remove() is resulting in this exception as well..
– AmalgovinusApr 4 '16 at 20:53

Note that this exception does not always indicate that an object has been concurrently modified by a different thread. If a single thread issues a sequence of method invocations that violates the contract of an object, the object may throw this exception. For example, if a thread modifies a collection directly while it is iterating over the collection with a fail-fast iterator, the iterator will thow this exception

yes people run into it -- the problem is you can't modify the list while iterating over it. I have used 2 alternatives in the past:

You can keep track of the indexes of the items you want to remove, and then remove them after you are done iterating.

Or you can copy all the ones you want to keep into a new list as you iterate, and then discard the old list when done.

those options assume you have to iterate over the list to find the elements to remove -- useful in cases where the list elements are complex objects with properties you might test on.

In your particular case, you dont even need to iterate, as you can just use removeAll. Look at the API here. There are also nifty methods like retainAll that discard everything that is not in the argument. You can use remove/retain-like methods whenever the objects in the list implement equals and hashcode properly. If you cannot rely on equals/hashcode to identify equality between instances in your app, you will have to do the removal yourself....