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));