Не рекурсивный способ достижения того же самого может быть:
Нет, не будет. Результат первого вызова будет сохранен в скомпилированном коде во временной переменной.
Из Эффективная Java 2nd. Эд. , элемент 46:
Обратите внимание, что при использовании цикл for-each, даже для массивов. Фактически, это может дать небольшое преимущество в производительности. над обычным циклом for в некоторых случаях, поскольку он вычисляет предел индекс массива только один раз.
Нет, он будет вызван один раз. Это не похоже на условие завершения цикла for, который оценивается на каждой итерации.
EnhancedForStatement:
for ( VariableModifiersopt Type Identifier: Expression) Statement
и далее:
T[] a = Expression;
L1: L2: ... Lm:
for (int i = 0; i < a.length; i++) {
VariableModifiersopt Type Identifier = a[i];
Statement
}
Это (в псевдокоде) эквивалент расширенного цикла for для массивов. И становится ясно, что Выражение оценивается один раз, а полученный массив присваивается T[] a
.
Поэтому совершенно безопасно использовать даже сложные выражения в операторе расширенного цикла for.
Нет.
Цикл for - это просто синтаксический сахар. Он ведет себя по-разному в зависимости от того, применяется ли он к аргументу Array или к объекту, реализующему интерфейс Iterable.
Для объектов Iterable цикл расширяется примерно до следующего:
Iterator<ArrayElement> iter = iterableObject.iterator();
while (iter.hasNext()) {
ArrayElement e = iter.next();
// do smth
}
То, что на самом деле делает ваш пример кода, выглядит примерно так:
Object[] temp = Method.returnArray();
for ( int i = 0; i < temp.length; i++ ) {
ArrayElement e = (ArrayElement) temp[i];
// do smth
}
Нет, я так не думаю. С тех пор я бы заметил это «на производстве» (с плохой производительностью).
Итак, продолжайте, продолжайте циклы foreach!