Массивы на Java и то, как они хранятся в памяти

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

[object][object]

или вот так:

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

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

Ответ 1

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

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

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

Ответ 2

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

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

является:

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

Итак, когда вы делаете:

Person[] ps = new Person[5];

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

Изменить: (почти) версию 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;

Ответ 3

Массивы - это непрерывное пространство памяти, поэтому они выглядят как ваш первый эскиз:

[object-reference][object-reference]

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

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