Ответ 1
Да. Заказ не изменяется. Это относится ко всем типам коллекций Java Collection Framework, реализующих Arrays.sort(имена)
Запускает ли цикл Java foreach первый объект и работает в линейном режиме до конца? Например
String[] names = new String[] {"Zoe", "Bob", "Charlie", "Alex"};
for(String name : names) {
//do stuff...
}
Всегда ли обрабатывается строка "Зоя", затем "Боб" и т.д.? Не происходит сортировка? Я сам проверил его и не нашел, но мне нужна гарантия и не могу найти что-либо в документах.
Да. Заказ не изменяется. Это относится ко всем типам коллекций Java Collection Framework, реализующих Arrays.sort(имена)
Расширенный цикл 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
порядок не указан (если не предоставляется дополнительная гарантия):
Элементы возвращаются в определенном порядке (если этот набор не является экземпляром какого-либо класса, который предоставляет гарантию).