Если у вас есть ArrayList, многократное удаление может оказаться более дорогим, чем получение копии.
List<Type> list = /* ArrayList */
Set<Type> toRemove = /* HashSet */
List<Type> copy = new ArrayList<Type>(list.size());
for(Type t: list)
if(!toRemove.contains(t))
copy.add(t);
list = copy;
Лично я бы использовал цикл. Вероятно, он будет короче и четче.
Collection<Type> collection =
for(Iterator<Type> i=collection.iterator(); i.hasNext();)
if (i.next() is to be removed)
i.remove();
Причина, по которой итератор используется явно, состоит в том, чтобы использовать Iterator.remove (), который избегает исключения ConcurrentModificationException. Другой способ избежать этого - использовать копию коллекции, которая может быть предпочтительнее.
for(Type t : new ArrayList<Type>(collection))
if (t is to be removed)
collection.remove(t);
Это не так хорошо, но может работать достаточно хорошо.