Предположим, у меня есть метод, возвращающий массив, если я хочу сделать копию этого массива, используя цикл for для копирования каждого элемента:

for(int i=0; i < array.length;i++)
{
  copy[i] = someMethod()[i];
}

Будет ли этот цикл for повторять someMethod каждый раз, когда мы копируем элемент? Или он выполняет метод и сохраняет его где-нибудь, а затем копирует каждый элемент для копирования. Я задаю этот вопрос относительно эффективной среды выполнения: в первом случае время выполнения могло бы значительно увеличиться, если бы someMethod был сложным методом.

РЕДАКТИРОВАТЬ: Предположим, что array.length относится к длине массива, возвращаемого someMethod.

0
Allan 13 Мар 2018 в 17:40

2 ответа

Лучший ответ

... будет ли цикл for повторять someMethod каждый раз, когда мы копируем элемент?

Да, каждый раз создавая новый массив. Компилятор или JVM не будут переписывать цикл, чтобы вы могли сделать только один вызов. JVM выполняет множество оптимизаций, но (в основном) не меняет фундаментального поведения, которое вы указали в своем коде.

Если вы не хотите, чтобы метод повторно запускался на каждой итерации, не вызывайте его в теле цикла. Вызовите его один раз перед циклом и запомните возвращаемый массив, а затем используйте его.

Боковое примечание: см. Также System.arraycopy метод.

1
T.J. Crowder 13 Мар 2018 в 14:44

Да, он вызывает someMethod () для каждой итерации вашего цикла. Если вы хотите сохранить возвращаемое значение, вызовите someMethod () вне цикла, например:

Примечание: я пытался исправить ваш синтаксис. Также вам нужно будет убедиться, что массив копий был правильно инициализирован до нужного вам размера.

someMethod();
for(int i=0; i < array.length;i++)
{
  copy[i] = *array*[i];
}
0
Doctor Parameter 13 Мар 2018 в 14:48