продвинутый для каждого цикла в методе вызова Java, который возвращает массив для повторения каждый раз? - PullRequest
29 голосов
/ 21 июля 2010

Его,

У меня вопрос к расширенному циклу for в Java.Если есть вызов метода Method.returnArray () и я перебираю массив с помощью for (ArrayElement e: Method.returnArray ()) {// do smth}

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

Спасибо.

Ответы [ 5 ]

39 голосов
/ 21 июля 2010

Нет, не будет. Результат первого вызова будет сохранен во скомпилированном коде во временной переменной.

С Эффективная Java 2-я. Ред. , Пункт 46:

Обратите внимание, что за использование не снижается производительность. цикл для каждого, даже для массивов. На самом деле, это может предложить небольшое преимущество в производительности по сравнению с обычным циклом for в некоторых случаях, так как он вычисляет предел индекс массива только один раз.

10 голосов
/ 21 июля 2010

Из спецификации языка Java :

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.

4 голосов
/ 21 июля 2010

номер

Цикл 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
}     
2 голосов
/ 21 июля 2010

Нет, он будет вызван один раз. Это не похоже на условие завершения стандартного цикла for, который оценивается на каждой итерации.

0 голосов
/ 21 июля 2010

Нет, я так не думаю.Я бы заметил это «на производстве» (с плохими характеристиками) с тех пор.

...