Я знаю, что этот вопрос предполагает только Collection
, а не конкретнее List
. Но для тех, кто читает этот вопрос и которые действительно работают со ссылкой List
, вы можете вместо этого ConcurrentModificationException
с while
-циклом (изменяя его), если вы хотите избежать Iterator
(либо если вы хотите избежать этого в целом, либо избегать его специально для достижения порядка зацикливания, отличного от остановки до конца для каждого элемента [который, я считаю, является единственным порядком, который может выполнять только Iterator
)):
* Обновление: см. Комментарии ниже, которые поясняют, что аналогичное также возможно с традиционным для цикла.
final List<Integer> list = new ArrayList<>();
for(int i = 0; i < 10; ++i){
list.add(i);
}
int i = 1;
while(i < list.size()){
if(list.get(i) % 2 == 0){
list.remove(i++);
} else {
i += 2;
}
}
Нет ConcurrentModificationException из этого кода.
Там мы видим, что цикл не начинается в начале и не останавливается на каждом элементе (что, как я считаю, сам Iterator
не может сделать).
FWIW мы также видим, что get
вызывается на list
, что невозможно сделать, если его ссылка была просто Collection
(вместо более специфического List
-типа Collection
) - List
Интерфейс включает get
, но интерфейс Collection
- нет. Если бы не эта разница, тогда ссылка list
могла бы быть Collection
[и, следовательно, технически этот Ответ был бы тогда прямым ответом, а не тангенциальным ответом].
FWIWW тот же код все еще работает после изменения, чтобы начинаться с начала и с остановки на каждом элементе (точно так же, как Iterator
order):
final List<Integer> list = new ArrayList<>();
for(int i = 0; i < 10; ++i){
list.add(i);
}
int i = 0;
while(i < list.size()){
if(list.get(i) % 2 == 0){
list.remove(i);
} else {
++i;
}
}