Как для каждого цикла защита от пустого списка?
Я читаю на 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, и цикл не будет выполняться. Как насчет каждого цикла?
Ответы
Ответ 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®