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

时间:2011-04-06 09:48:46

标签: java arrays memory

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

[object][object]

或者像这样:

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

换句话说,实际上在记忆中做了什么。 array[0] = new class()只返回对内存中保留位置的引用,而class[] array = new class[10]语句是否会创建10个指针的行,这些指针稍后会被新语句分配?

3 个答案:

答案 0 :(得分:16)

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

因此,new Integer[10]仅为10个Integer引用创建空间。 创建10个Integer对象(甚至是10个Integer对象的可用空间)。

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

答案 1 :(得分:5)

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

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

是:

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

所以当你这样做时:

Person[] ps = new Person[5];

您要保留一组包含5个人员的引用。接下来,您将必须创建每个真人,并将每个引用分配给数组中的某个位置。

编辑:以前代码的(几乎)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;

答案 2 :(得分:0)

阵列是连续的记忆空间,因此它们看起来更像是你的第一个草图:

[object-reference][object-reference]

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

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