Подтвердить что ты не робот

Как для каждого цикла защита от пустого списка?

Я читаю на http://www.leepoint.net/notes-java/flow/loops/foreach.html. для каждого эквивалента

for (int i = 0; i < arr.length; i++) { 
     type var = arr[i];
      body-of-loop
}

является

for (type var : arr) {
      body-of-loop
}

Мой вопрос, как работает для каждого цикла для пустого списка. Я знаю, что для обычного цикла for значение arr.length будет равно 0, и цикл не будет выполняться. Как насчет каждого цикла?

4b9b3361

Ответ 1

Мой вопрос в том, как a для каждого цикла работает для пустого списка

ForEach также работает одинаково. Если длина равна нулю, цикл никогда не выполняется.

Единственное различие между ними заключается в использовании цикла ForEach, когда вы хотите перебрать все элементы списка или массива, тогда как в случае нормального цикла for вы можете управлять индексом начала и конца.

Ответ 2

Он использует итератор коллекции Iterable, например. Список. Обязанность разработчика Iterator написать метод hasnext() для возврата false, если нет следующего элемента, который будет иметь место, если коллекция пуста

Ответ 3

Да, это эквивалентно.

Если список пуст, цикл for-each не выполняется даже один раз.

Ответ 4

Как @user3810043 ссылается в своих комментариях ответа, усиленные for утверждения буквально оцениваются так же, как эквивалент основные for заявления:

14.14.2. Улучшенный для утверждения

...

Тип Expression должен быть подтипом необработанного типа Iterable или типа массива (§10.1), иначе возникает ошибка времени компиляции.

...

В противном случае выражение обязательно имеет тип массива T [].

Пусть L1... Lm будет (возможно, пустой) последовательностью меток, непосредственно предшествующих расширенному оператору for.

Расширенный оператор for эквивалентен основному для оператора формы:

T[] #a = Expression;
L1: L2: ... Lm:
for (int #i = 0; #i < #a.length; #i++) {
    {VariableModifier} TargetType Identifier = #a[#i];
    Statement
}

#a и #i - это автоматически генерируемые идентификаторы, которые отличаются от любых других идентификаторов (автоматически генерируемых или иным образом), которые находятся в области действия в точке, где происходит расширенный оператор for.

^ Цитата из спецификации языка Java®