Вопрос
Отредактировал этот вопрос из-за моих плохих примеров..Вот мой обновленный вопрос:
Будут ли следующие значения равными по скорости и распределению памяти:
int b;
for (int i = 0; i < 1000; i++)
b = i;
и
for (int i = 0; i < 1000; i++)
int b = i;
Решение
Нет, это не так.
В первом случае у вас есть одна переменная, которой присвоено 1000 различных значений, и в конечном итоге вы сможете получить последнее значение (999) после завершения конструктора.
Во втором случае вы вызываете практически бездействующий метод 1000 раз.Второй метод не имеет побочных эффектов и не возвращает возвращаемого значения, поэтому он бесполезен.Локальная переменная «существует» только на время вызова метода, тогда как переменная экземпляра в первом примере является частью объекта, поэтому будет жить дальше.
Обратите внимание, что это не ограничивается примитивами — любой другой тип будет вести себя точно так же.
Другие советы
- Да.И то, и другое совершенно бесполезно.
- Нет.Размер экземпляра Class1 больше размера экземпляра Class2 из-за переменной-члена.
Ответ зависит от того, что вы подразумеваете под словом «равный» =)
Нет.
- В
Class1
переменнаяa
— поле, доступное всем методам класса. - В
Class2
это не вариант:a
является локальной переменной внутри методаassign
.Послеassign
отделка, стоимостьa
отбрасывается.
Нет, у одного есть переменная экземпляра a
(Класс 1), а у одного нет.
В первом случае вы уже объявили b как целое число, и его значение обновляется каждый раз при выполнении цикла.Во втором случае b объявляется и инициализируется значением i при каждом выполнении цикла.Я не уверен на 100%, но думаю, что второй случай требует больше памяти, но не думаю, что разница в скорости будет заметна.
Стоит отметить, что любой достойный компилятор, а я твердо верю, что JIT стоит много соли, во втором случае просто выделил бы место для "b" ONCE, т.е.фаза «декларирования» была бы бессмысленной.
Вы пробовали это?Он даже не компилируется!
for (int i = 0; i < 1000; i++)
int b = i;
Сообщения об ошибках компилятора:
Example.java:4: '.class' expected
int b = i;
^
Example.java:4: not a statement
int b = i;
^
Example.java:4: illegal start of expression
int b = i;
^
Тело цикла должно содержать хотя бы один оператор.Объявление переменной не является оператором, поэтому цикл только с объявлением переменной недопустим.