2013-07-09 3 views
-2

Если у нас есть 2 способа перебирать:Итерация через сбор. Каковы различия?

Первое:

Object ob; 
ArrayList<Obect> list; 
for(int i=0;i<list.size();i++) 
{ //Todo} 

Второе:

Object ob; 
ArrayList<Obect> list; 
for(Object o:list) 
{ //Todo} 

Так каковы различия? Я обнаружил, что во втором случае, если попытаться удалить объект в этом цикле, я получаю исключение параллельной модификации.

+4

Посмотрите на [документы] (http://docs.oracle.com/javase/tutorial /java/nutsandbolts/for.html) для получения дополнительной информации. –

+0

Первый случай обычно не является хорошим выбором для удаления объекта. Рассмотрим, что происходит, когда вы удаляете объект по текущему индексу, остальным элементам в списке и индексу цикла. –

ответ

6

В вашем первом примере вы сами повторяете этот список. Вы должны взять на себя ответственность за сохранение состояния вашей итерации, если вы измените коллекцию во время итерации.

В вашем втором примере цикл «foreach», который вы используете, использует неявный Iterator за кулисами. Если вы сами модифицируете коллекцию с активным Iterator, вы получите ConcurrentModificationException.

Если необходимо удалить элемент, а с помощью Iterator, а затем использовать явное Iterator:

for(Iterator<Object> itr = list.iterator(); itr.hasNext()) 
{ 
    Object o = itr.next(): 
    if (decideToRemove) 
     itr.remove(); 
} 

remove операция Iterator «s допускается удалить элемент без метания ConcurrentModificationException.

0

Правильный способ для удаления из коллекций является использование 3-го рода цикл, который выглядит следующим образом:

for (Iterator<Object> iterator = new ArrayList<>().iterator(); iterator.hasNext();) { 
     Object o = iterator.next(); 
     if (someCondition()) 
      iterator.remove(); 
    } 
Смежные вопросы