В этом конкретном случае, с циклом foreach, я ожидаю, что ваш код скомпилируется примерно так:
Iterator<Foo> it = fooService.getFooList().iterator();
while (it.hasNext()) {
Foo foo = it.next();
// ...
}
Так что в этом случае это не имеет значения.
Однако, если вы будете использовать другой вид цикла, то это может иметь значение.Например:
for(int i = 0; i < fooService.getFooList().size(); i++){
Foo foo = fooService.getFooList().get(i);
// ...
}
Если ваш список подвергается внешней модификации, маловероятно, что компилятор сможет доказать, что размер списка не изменится, поэтому он будет вызывать getFooList().size()
каждую итерацию для сравнения с i
, так что будут некоторые незначительные дополнительные издержки.
Но учтите, что если размер списка изменяется, то i < fooService.getFooList().size()
отражает это.Это может быть полезно, если вы знаете об этом, но опасно, если вы этого не делаете.
Если вы знаете, что размер списка не изменится, вы можете сделать что-то подобное, чтобы устранить эти издержки (или просто использовать Iterator
или улучшенный цикл for-each, если вам не нужны индексы):
List<Foo> fooList = fooService.getFooList();
final int fooListSize = fooList.size();
for(int i = 0; i < fooListSize ; i++){
Foo foo = fooList.get(i);
// ...
}
Несмотря на все это, вам, вероятно, следует предпочесть удобочитаемость, а не микрооптимизацию.
Но если ваше приложениезависит от времени выполнения, и ваш список велик, и эти небольшие проверки складываются, тогда вы можете захотеть сделать что-то подобное выше.