Похоже, не все отвечающие в курсе, что объявление != инициализация. Согласно спецификации 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);
}
предпочтителен второй, потому что он минимизирует область видимости. А если таких переменных несколько, то и увеличивает читаемость.
Java
почему выгодно переменные обявлять до цикла а не в цикле
Саша Пугач
Да, действительно разницы нет (на чистом байт коде проверял разницы нет). (Мой пост можно аннулировать:)).
Потому что в цикле они будут декларироваться каждый оборот заново - бессмысленно и беспощадно. По аналогии, как если бы Вы представились незнакомым людям вместо одного раза вначале - каждые 5 секунд ЗАНОВО... все уже поняли, как Вас зовут - но Вы снова и снова.... =) "Я - Вася, столько-то лет, я- Вася, столько-то лет, я- Вася столько-то лет,..."
Виталий Задорожный
Не, в вашем примере логика страдает. Лучше так: на каждой итерации цикла надо в коробочку положтьб яблоко. В одном случае коробочка уже готова и мы просто кладём в неё яблоко на каждой итерации. В другом случае мы на каждой итерации клеим коробочку, кладём в неё яблоко, затем выкидываем коробочку вместе с яблоком.
Потому-то сам цикл каждую единицу цикла будет резервить память на создание новой переменной:) А так память зарезервирована и будет просто перезаписывается (БИНГО).
При объявлении переменной до цикла у тебя ровно 1 раз выделится память на эту переменную и потом при использовании её в цикле будет задействована именно та, ранее выделенная память
Если же объявлять внутри цикла (ДЕЙСТВИТЕЛЬНО НАДО) то каждый раз будет выделяться новая память. а старая будет зачищаться только через некоторое время, поскольку необходимо время, чтоб данный участок памяти более неиспользуемый. И в итоге у тебя вместо 1 выделенного участка памяти будет 2, а то и более. Что не есть гуд
Если же объявлять внутри цикла (ДЕЙСТВИТЕЛЬНО НАДО) то каждый раз будет выделяться новая память. а старая будет зачищаться только через некоторое время, поскольку необходимо время, чтоб данный участок памяти более неиспользуемый. И в итоге у тебя вместо 1 выделенного участка памяти будет 2, а то и более. Что не есть гуд
Похожие вопросы
- почему одни переменные могут объявлять буквы другие цифры?
- Проблема в коде, цикл пропускает строчку и продолжает свою работу без сбоев в остальном.
- Конструкция Java: i++ и ++i в циклах for
- Как избавиться без вложенного цикла в java
- Как создать цикл, который будет считать количество минимальных значений массива на джава
- Допишите условие цикла for, чтобы заполнить массив случайными тратами
- Язык JAVA - ЗАДАЧКА НА ЦИКЛЫ
- Как работает такой цикл for? for (i=1;i>=n;i--) И для каких N он может использоваться?
- Зачем создают приватные переменные, а затем делают их общедоступными через публичные методы?
- Как сравнить элементы массива с другой переменной?