2010-07-06 2 views
4

У меня есть следующий код, но иногда я получаю какое-то исключение параллелизма при его запуске.Разница в производительности между конструкцией Iterator и конструкцией foreach

ArrayList<Mob> carriers = new ArrayList<Mob>(); 
ArrayList<Mob> mobs = new ArrayList<Mob>(); 
... 
for (Mob carrier : carriers){ 
    for (Mob mob : mobs){ 
     checkInfections (carrier, mob); 
    } 
} 

Я реорганизовал его для решения проблемы параллелизма, но это действительно привело меня к вопросу. Будет ли разница в производительности, если я изменил конструкцию for на шаблон Iterator? Какова разница уровней доступа между конструкцией foreach и классом Iterator?

ответ

8

Разница в основном синтаксический сахар, за исключением того, что Iterator может удалять элементы из Collection, итерации. Технически усовершенствованные петли for позволяют вам контактировать с чем-либо, что есть Iterable, которое, как минимум, включает в себя как Collection s, так и массивы.

Не беспокойтесь о различиях в производительности. Такая микрооптимизация - неважное отвлечение. Если вам нужно удалить предметы по ходу дела, используйте Iterator. В противном случае for петли, как правило, используются более просто потому, что они более читаемым, а именно:

for (String s : stringList) { ... } 

против:

for (Iterator<String> iter = stringList.iterator(); iter.hasNext();) { 
    String s = iter.next(); 
    ... 
} 
+3

Чтобы быть супер педантичным, улучшенные циклы 'for' позволяют вам перебирать все, что есть' Iterable' или массив, а массивы не являются 'Итерируемыми'. – ColinD

+0

@ColinD Я упоминаю об этом в первом абзаце. – cletus

+1

Я был педантичен о том, как вы сформулировали его в первом абзаце. – ColinD

0

За кулисами новый стиль for реализуется в терминах итераторов компилятором, поэтому не будет никакой разницы, если вы сделаете это сами.

0

«Произошло какое-то исключение параллелизма», о котором вы говорите, скорее всего, java.util.ConcurrentModificationException. Вы получаете это, потому что вы не можете изменить список во время итерации по нему; если вы это сделаете, итератор заметит и выбросит это исключение.

Если вам нужно удалить элементы из списка во время прохода по ней, то сделайте это через remove() метод на итератора, например:

List<String> list = ...; // wherever you get this 

for (Iterator<String> iter = list.iterator(); iter.hasNext();) { 
    String s = iter.next(); 
    if (...) { 
     iter.remove(); // Remove element through iterator 
    } 
} 

(Примечание: Вы не можете использовать синтаксис Еогеасп для цикла в этом случае, потому что вам нужен явный доступ к итератору).

+0

о. Понимаю. благодаря – allan

0

Вы можете использовать Iterator (интерфейс) только в таких коллекциях, как List, Set & Queue, но для каждой петли цикла можно использовать для всего, что итерируется как Collections and Array. И для каждого цикла читаем больше.

Смежные вопросы