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

Поддерживает ли цикл Java foreach порядок?

Запускает ли цикл Java foreach первый объект и работает в линейном режиме до конца? Например

String[] names = new String[] {"Zoe", "Bob", "Charlie", "Alex"};
for(String name : names) {
  //do stuff...
}

Всегда ли обрабатывается строка "Зоя", затем "Боб" и т.д.? Не происходит сортировка? Я сам проверил его и не нашел, но мне нужна гарантия и не могу найти что-либо в документах.

4b9b3361

Ответ 2

Расширенный цикл for указан в JLS 14.14.2, где написан его эквивалентный код.

Его можно использовать для перебора массивов и экземпляров Iterable.

  • Для массива порядок итераций всегда сохраняется и согласован между циклами. Это связано с тем, что он эквивалентен простому циклу for с индексом, идущим от начала массива до конца.

    Усиленный оператор for эквивалентен основному выражению формы:

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

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

  • Для Iterable он будет следовать порядку соответствующего Iterator (извлекается при вызове Iterable.iterator()), который может или может не быть согласованным между прогонами.

    Усиленный оператор for эквивалентен основному выражению формы:

    for (I #i = Expression.iterator(); #i.hasNext(); ) {
    {VariableModifier} TargetType Identifier =
        (TargetType) #i.next();
        Statement
    }
    

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

    Вы должны ссылаться на Javadoc каждого типа, чтобы убедиться, что порядок согласован или нет. Например, явно указано, что для List итератор сохраняет порядок:

    Возвращает итератор по элементам в этом списке в правильной последовательности.

    Пока явно указано, что для Set порядок не указан (если не предоставляется дополнительная гарантия):

    Элементы возвращаются в определенном порядке (если этот набор не является экземпляром какого-либо класса, который предоставляет гарантию).