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(it.next())) {
it.remove();
}
}
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.