Java中的数组以及它们如何存储在内存中

我正在尝试理解java中的数组设置。 为什么必须在创建数组后为数组中的每个对象初始化空间。 它是如何存储在内存中的:

[object][object] 

或者像这样:

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

换句话说,在内存中实际做了什么。 array[0] = new class()只返回对内存中保留位置的引用,而class[] array = new class[10]语句创建了10个指针的行,稍后由新陈述?

Java中的数组存储以下两种内容之一:原始值( intchar ,…)或引用(也称为指针)。

因此, new Integer[10]仅为10个Integer引用创建空间。 它不会创建10个Integer对象(甚至10个Integer对象的自由空间)。

顺便提一下,这与字段,变量和方法/构造函数参数的工作方式完全相同:它们也只存储原始值或引用。

如果您熟悉C / C ++, 您可以将Java对象引用视为对象 (或指向结构的指针)的指针。 所以:

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

是:

  • 声明指向Person结构的ap指针(在堆栈中)
  • 保留内存并初始化Person结构
  • 将其地址分配给p
  • 在p引用的对象上执行方法setName

所以当你这样做时:

 Person[] ps = new Person[5]; 

你保留了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; 

数组是连续的内存空间,所以它们看起来更像是你的第一个草图:

[object-reference][object-reference]

array[0] = new class()将在array[0]存储对新创建对象的引用。

class[] array = new class[10]将创建一个包含十个空槽(或十个空引用)的数组。