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

rub*_*buc 11 java memory arrays

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

[object][object]
Run Code Online (Sandbox Code Playgroud)

或者像这样:

[*class]->[object]  
[*class]->[object]
Run Code Online (Sandbox Code Playgroud)

换句话说,实际上在内存中做了什么.难道array[0] = new class()仅仅返回一个参考给预留位置在内存中,与class[] array = new class[10]声明一起创造的10个球线的东西,这是后来由新的报表分配到?

Joa*_*uer 18

阵列,Java软件商店的两件事情之一:要么基本值(int,char,...)或引用(又名指针).

因此,仅为new Integer[10]10个Integer参考创建空间.它并没有创造10个Integer物体(或甚至10个免费空间Integer物体).

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

  • 由于没有对原始值的引用,因此值本身存储在数组中而不是引用中. (2认同)

hel*_*ios 5

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

Person p = new Person();
p.setName("Helios");
Run Code Online (Sandbox Code Playgroud)

是:

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

所以当你这样做时:

Person[] ps = new Person[5];
Run Code Online (Sandbox Code Playgroud)

你保留了一个由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)
Run Code Online (Sandbox Code Playgroud)

而且你可以做到

ps[3] = p;
Run Code Online (Sandbox Code Playgroud)