it-swarm.com.ru

инициализация массива int

У меня есть простой вопрос, связанный с Java . Допустим, у вас есть массив int в качестве переменной экземпляра:

int[] in = new int[5];

Итак, теперь по умолчанию он содержит 5 нулей . Но что если у вас тот же массив, что и у локальной переменной. Это инициализируется нулями? Это не домашняя работа, я изучаю язык Java . С уважением

22
uml

Прежде всего понять, что локальные переменные хранятся в stack, которые не инициализируются явно с их значениями по умолчанию. В то время как переменные instance хранятся в Heap, они по умолчанию инициализируются своим значением default

Кроме того, objects также создаются в Heap независимо от того, содержит ли ссылочная переменная экземпляра свою ссылку или локальную ссылочную переменную.


Теперь, что происходит, когда вы объявляете ссылку на ваш массив как локальную переменную и инициализируете ее массивом:

int[] in = new int[5];

Ссылка на массив (in) хранится в stack, а память выделяется для массива, способного содержать 5 целочисленных элементов в heap (помните, объекты создаются в Heap). Затем 5 непрерывных ячеек памяти (size = 5) для хранения значения integer выделяются на Heap. И каждый index в объекте массива содержит reference для этой ячейки памяти в последовательности. Тогда ссылка на массив указывает на этот массив. Таким образом, поскольку память для 5 целочисленных значений выделяется в куче, они инициализируются до значения по умолчанию.

А также, когда вы объявляете вашу ссылку на массив и не инициализируете ее с любым объектом массива: -

int[] in;

Ссылка на массив создается в Stack (так как это локальная переменная), но по умолчанию она не инициализируется ни в массив, ни в null, как в случае с переменными экземпляра.


Итак, вот как выглядит распределение при использовании первого способа объявления и инициализации массива:

"Your array reference"
     "on stack"    

       |    |          "Array object on Heap"
       +----+                  
       | in |---------->  ([0, 0, 0, 0, 0])
       +----+
       "Stack"                  "Heap"
52
Rohit Jain

Это то же самое, если вы делаете: 

int[] in = new int[5] как переменная экземпляра или локальная переменная. Объект массива in будет содержать нули в обоих случаях.

Разница была бы, если бы вы сделали что-то вроде: 

  1. Переменная экземпляра: int[] in; (он инициализируется с помощью null ), и объект in будет жить в пространстве heap.

  2. Локальная переменная: int[] in; (он должен быть инициализирован пользователем) будет жить в stack

5
Ioan

Для массивов примитивного типа он инициализируется их значениями по умолчанию . В документации он говорит: 

создается одномерный массив указанной длины и каждый компонент массива инициализируется своим значением по умолчанию

Для целочисленного типа значением по умолчанию является 0.

3
Parvin Gasimzade

Да, когда вы инициализируете массив, содержимое будет установлено в значение по умолчанию для этого типа, для int это будет 0, а для ссылочного типа это будет null.

Если вы инициализируете массив и проверяете содержимое, вы можете убедиться в этом сами:

...
final int[] in = new int[5];

for (int i = 0; i < in.length; i++) {
    System.out.println(in[i]);
}
...

Это напечатает:

0
0
0
0
0
2
Jonathan

да

public void method() {
    int[] in = new int[5];
    System.out.pritnln(in[0]); //output in 0
}

В этом случае ваш массив является локальной переменной , все что вам нужно, это инициализировать ваш массив . как только вы инициализируете свой массив, voila your элементы массива ** s получают свои ** значения по умолчанию .

1
PermGenError

На самом деле не имеет значения, будет ли объявленный массив в переменной экземпляра или локальной переменной инициализирован значением по умолчанию.

Каждая переменная класса, переменная экземпляра или компонент массива инициализируется значением по умолчанию при его создании.

Согласно JLS

An array initializer creates an array and provides initial values for all its components.

1
Aniket Thakur

Массив не содержит 5 нулей, когда вы создаете его как локальную переменную.

0
Ishan Khanna