1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
|
From the javadoc for
[`Iterator.remove`](https://docs.oracle.com/javase/9/docs/api/java/util/Iterator.html#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:
```java
Iterator<String> it = ids.iterator();
while (it.hasNext()) {
if (shouldRemove(it.next())) {
it.remove();
}
}
```
to this:
```java
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`](https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html#removeIf-java.util.function.Predicate-):
```java
ids.removeIf(id -> shouldRemove(id));
```
|