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

Не рекурсивный способ достижения того же самого может быть:

31
задан Vimal 29 September 2019 в 23:00
поделиться

5 ответов

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

Из Эффективная Java 2nd. Эд. , элемент 46:

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

40
ответ дан 27 November 2019 в 22:14
поделиться

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

2
ответ дан Eyal Schneider 27 November 2019 в 22:14
поделиться

Из спецификации языка 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.

11
ответ дан 27 November 2019 в 22:14
поделиться

Нет.

Цикл 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
}     
5
ответ дан 27 November 2019 в 22:14
поделиться

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

Итак, продолжайте, продолжайте циклы foreach!

-1
ответ дан 27 November 2019 в 22:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: