Java

почему выгодно переменные обявлять до цикла а не в цикле

Похоже, не все отвечающие в курсе, что объявление != инициализация. Согласно спецификации JVM, память на стеке под переменные из нового скоупа (коим является любой блок, в том числе цикл) выделяется перед вхождением в этот скоуп, а не внутри него. Поэтому байт-код с точки зрения количества выделений памяти будет идентичным, никаких "перевыделений" там быть не может. Вообще говоря, это касается не только Java - большинство компиляторов работает так.

Если твоя переменная numeric используется только внутри цикла, то из двух вариантов

// 1.
Numeric numeric;
for (int i = 0; i < 10; i++) {
numeric = new Numeric(i);
}

// 2.
for (int i = 0; i < 10; i++) {
Numeric numeric = new Numeric(i);
}

предпочтителен второй, потому что он минимизирует область видимости. А если таких переменных несколько, то и увеличивает читаемость.
Владимир Скосарь
Владимир Скосарь
1 858
Лучший ответ
Саша Пугач Да, действительно разницы нет (на чистом байт коде проверял разницы нет). (Мой пост можно аннулировать:)).
Потому что в цикле они будут декларироваться каждый оборот заново - бессмысленно и беспощадно. По аналогии, как если бы Вы представились незнакомым людям вместо одного раза вначале - каждые 5 секунд ЗАНОВО... все уже поняли, как Вас зовут - но Вы снова и снова.... =) "Я - Вася, столько-то лет, я- Вася, столько-то лет, я- Вася столько-то лет,..."
VD
Valery De Tur
80 035
Виталий Задорожный Не, в вашем примере логика страдает. Лучше так: на каждой итерации цикла надо в коробочку положтьб яблоко. В одном случае коробочка уже готова и мы просто кладём в неё яблоко на каждой итерации. В другом случае мы на каждой итерации клеим коробочку, кладём в неё яблоко, затем выкидываем коробочку вместе с яблоком.
Потому-то сам цикл каждую единицу цикла будет резервить память на создание новой переменной:) А так память зарезервирована и будет просто перезаписывается (БИНГО).
Саша Пугач
Саша Пугач
4 997
При объявлении переменной до цикла у тебя ровно 1 раз выделится память на эту переменную и потом при использовании её в цикле будет задействована именно та, ранее выделенная память
Если же объявлять внутри цикла (ДЕЙСТВИТЕЛЬНО НАДО) то каждый раз будет выделяться новая память. а старая будет зачищаться только через некоторое время, поскольку необходимо время, чтоб данный участок памяти более неиспользуемый. И в итоге у тебя вместо 1 выделенного участка памяти будет 2, а то и более. Что не есть гуд