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结构的指针(在堆栈中)
  • 保留内存并初始化Person结构
  • 把它的地址分配给p
  • 在由p引用的对象上执行方法setName
  • 所以当你在做:

    Person[] ps = new Person[5];
    

    您正在保留对Person的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;
    

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

    [object-reference][object-reference]

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

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

    链接地址: http://www.djcxy.com/p/20695.html

    上一篇: Arrays in Java and how they are stored in memory

    下一篇: How should I be transferring data through multiple view controllers?