内存中的对象数组

时间:2015-04-11 18:11:53

标签: java arrays heap

我对阵列的基本问题很少。

  1. 考虑我声明一个整数数组

    int intArray[] = new intArray[10];
    intArray[0] = 10;
    intArray[1] = 20;
    // and so on...
    
  2. intArray如何存储在内存中(我的意思是数组的元素)?

    1. 考虑我声明某种类型的对象数组,比如说Employee

      class Employee {
          int x = 10; 
          int y = 20; 
      
          Employee(int x, int y) {
              this.x = x;
              this.y = y;
          }
      }
      
      class TestEmployee {
          public void main(String args[]) {
              Employee empArray = new Employee[10];
              empArray[0] = new Employee(10, 20);
              empArray[1] = new Employee(30, 40);
              ...
          }
      }
      
    2. empArray在记忆中的样子是什么?

2 个答案:

答案 0 :(得分:1)

考虑以下图像。第一个图像显示了如何将一个基本类型数组(byte,short,int,long,float,double,char,boolean)存储在内存中。

作为对象的数组本身是使用new关键字实例化的,并在堆中分配了一些内存。但s ince它是一个原始类型的数组,它直接存储与其大小一样多的原始值。这些值设置为0(在int基本类型数组的情况下),除非我们使用诸如intArray[0] = 10;

之类的指令明确地更改它们

primitive types arrays

然而,在refence类型数组的情况下,存在一个有趣的区别。 在使用new关键字进行实例化后,数组本身在堆上分配了一些内存空间。但它并不直接存储对象,而是存储对其所持对象的引用。这些引用将为null或对内存中某处的相应对象的引用(或地址)。除非使用类似于empArray[0] = new Employee(10, 20);

的指令更改,否则对每个对象的引用的默认值为null

关于你的后续问题,在一个链表中,假设我试图找到一个位于的对象,假设从列表头部开始的第11个位置,我将不得不迭代10次才能找到它。因此,链表中元素的大小和位置将影响检索元素所花费的时间。然而,在一个数组中,我只需要知道索引,并在恒定时间内找到该元素。

reference types array

答案 1 :(得分:0)

  1. int数组:将有一个内存块,其大小为int的10倍,其中存储了值。

  2. Employee数组:将有一个内存块,其大小是对象引用的10倍,每个元素都将引用其他位置的Employee对象在内存中(或者它将是null)。