Быстрый вопрос о примитивах

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

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

int b;
for (int i = 0; i < 1000; i++)
    b = i;

а также

for (int i = 0; i < 1000; i++)
    int b = i;

person nalo    schedule 16.10.2009    source источник
comment
Второй кусок кода не компилируется. Смотрите мой ответ ниже.   -  person Jesper    schedule 16.10.2009


Ответы (7)


Нет, не будет.

В первом случае у вас есть одна переменная, которой присваивается 1000 различных значений, и в конечном итоге вы можете получить последнее значение (999) после завершения конструктора.

Во втором случае вы вызываете фактически недействующий метод 1000 раз. Второй метод не имеет побочных эффектов и не имеет возвращаемого значения, поэтому он бесполезен. Локальная переменная «существует» только на время вызова метода, тогда как переменная экземпляра в первом примере является частью объекта, поэтому будет жить.

Обратите внимание, что это не ограничивается примитивами — любой другой тип будет вести себя так же.

person Jon Skeet    schedule 16.10.2009

  • Да. Оба они совершенно бесполезны.
  • Нет. Размер экземпляра Class1 больше размера экземпляра Class2 из-за переменной-члена.

Ответ зависит от того, что вы имеете в виду, говоря «равно» =)

person SadSido    schedule 16.10.2009

Нет.

  • В Class1 переменная a является полем, доступным для всех методов класса.
  • В Class2 это не так: a является локальной переменной в методе assign. После завершения assign значение a отбрасывается.
person Stephan202    schedule 16.10.2009

Нет, у одного есть переменная экземпляра a (Class1), а у другого нет.

person Bart Kiers    schedule 16.10.2009

В первом случае вы уже объявили b как int, и его значение обновляется каждый раз, когда выполняется цикл. Во втором, b объявляется и инициализируется значением i каждый раз, когда выполняется цикл. Я не уверен на 100%, но я думаю, что второй случай требует больше памяти, но я не думаю, что разница в скорости будет заметна.

person andy    schedule 16.10.2009

Стоит отметить, что любой достойный компилятор, и я твердо верю, что JIT стоит много соли, просто выделил бы место для «b» ОДИН РАЗ во втором случае, то есть фаза «объявления» была бы бессмысленной.

person M1EK    schedule 16.10.2009

Вы пробовали это? Он даже не компилируется!

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

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

person Jesper    schedule 16.10.2009