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

Будет ли расширен для/для каждого цикла в Java с использованием вызова метода, который возвращает массив, будет возвращать массив в каждой итерации?

У меня есть вопрос о каждой петле в Java. Если есть вызов метода MyClass.returnArray() и я перебираю массив с помощью

for (ArrayElement e : MyClass.returnArray()) {
   //do smth
}

будет ли .returnArray() вызываться при каждой итерации?

Благодарю.

4b9b3361

Ответ 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!