Массивы в Java и как они хранятся в памяти - PullRequest
11 голосов
/ 06 апреля 2011

Я пытаюсь понять настройку массива в Java. Почему вы должны инициализировать пространство для каждого объекта в массиве после создания массива. Как это хранится в памяти, как это:

[object][object]

или как это:

[*class]->[object]  
[*class]->[object]

Другими словами, что на самом деле делается в памяти. array[0] = new class() просто возвращает ссылку на зарезервированное место в памяти, и оператор class[] array = new class[10] создает что-то в соответствии с 10 указателями, которые позже назначаются новыми операторами?

Ответы [ 3 ]

16 голосов
/ 06 апреля 2011

Массивы в Java хранят одну из двух вещей: либо примитивные значения (int, char, ...), либо ссылки (указатели a.k.a).

Итак, new Integer[10] создает пространство только для 10 Integer ссылок. не создает 10 Integer объектов (или даже свободное пространство для 10 Integer объектов).

Кстати, точно так же работают поля, переменные и параметры метода / конструктора: они тоже хранят только примитивные значения или ссылки.

5 голосов
/ 06 апреля 2011

Если вы знакомы с C / C ++ , вы можете рассматривать ссылки на объекты Java как указатели на объекты (или указатели на структуры).Итак:

Person p = new Person();
p.setName("Helios");

- это:

  • объявить указатель ap на структуру Person (в стеке)
  • зарезервировать память и инициализировать структуру Person
  • назначить свой адрес p
  • выполнить метод setName для объекта, на который ссылается p

Поэтому, когда вы делаете:

Person[] ps = new Person[5];

youрезервируем массив из 5 ссылок на Person .Затем вам нужно будет создать каждого реального человека и присвоить каждую ссылку определенному месту в массиве.

Редактировать: (почти) версия C / C ++ предыдущего кода

class Person { ... };
typedef PersonStruct* Person; // I don't remember if this declaration is ok
Person p = new PersonStruct();
p -> setName(...);

Person[] ps = new Person[5]; 
// ps is a variable in the stack pointing to the array in the heap
// (being the array five references to the PersoStruct)

и вы могли бы сделать

ps[3] = p;
0 голосов
/ 06 апреля 2011

Массивы - это непрерывное пространство памяти, поэтому они больше похожи на ваш первый набросок:

[object-reference][object-reference]

array[0] = new class() сохранит в array[0] ссылку на новый созданный объект.

class[] array = new class[10] создаст массив из десяти пустых слотов (или десяти нулевых ссылок).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...