Modifying a collection while iterating over it in a loop may cause a ConcurrentModificationException to be thrown or lead to undefined behavior.


The problem

From the javadoc for Iterator.remove:

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 this method, unless an overriding class has specified a concurrent modification policy.

That is, prefer this:

Iterator<String> it = ids.iterator();
while (it.hasNext()) {
  if (shouldRemove( {

to this:

for (String id : ids) {
  if (shouldRemove(id)) {
    ids.remove(id); // will cause a ConcurrentModificationException!

TIP: This pattern is simpler with Java 8’s Collection.removeIf:

ids.removeIf(id -> shouldRemove(id));


Suppress false positives by adding the suppression annotation @SuppressWarnings("ModifyCollectionInEnhancedForLoop") to the enclosing element.