Вопрос

Отредактировал этот вопрос из-за моих плохих примеров..Вот мой обновленный вопрос:

Будут ли следующие значения равными по скорости и распределению памяти:

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;
                          ^

Тело цикла должно содержать хотя бы один оператор.Объявление переменной не является оператором, поэтому цикл только с объявлением переменной недопустим.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top