Будет ли расширен для/для каждого цикла в Java с использованием вызова метода, который возвращает массив, будет возвращать массив в каждой итерации?
У меня есть вопрос о каждой петле в Java. Если есть вызов метода MyClass.returnArray() и я перебираю массив с помощью
for (ArrayElement e : MyClass.returnArray()) {
//do smth
}
будет ли .returnArray() вызываться при каждой итерации?
Благодарю.
Ответы
Ответ 1
Нет, не будет. Результат первого вызова будет сохранен в скомпилированном коде во временной переменной.
От Эффективная Java 2nd. Ред., Пункт 46:
Обратите внимание, что при использовании для каждого цикла, даже для массивов. Фактически, это может дать небольшое преимущество в производительности над обычным для цикла в некоторых случаях, поскольку он вычисляет предел индекс массива только один раз.
Ответ 2
Из java language spec:
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
.
Таким образом, совершенно безопасно использовать даже сложные выражения в расширенном для оператора цикла.
Ответ 3
Нет.
Цикл 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
}
Ответ 4
Нет, он будет вызываться один раз. Это не похоже на условие завершения стандарта для цикла, которое оценивается на каждой итерации.
Ответ 5
Нет, я так не думаю. Я бы заметил это "на производстве" (с плохими выступлениями) с тех пор.
Итак, Идите, идите с петлями foreach!