java数组内存结构

译自:programcreek 

Java中的数组存储两种东西之一:要么是原始值(int, char, ...),或是引用(即指针)。

当一个对象通过"new"创建时,将会在堆内存分配空间,并且返回一个引用。这对于数组也是一样的,因为数组是对象。

1.一维数组

int arr[] = new int[3];  

int[] arr 只是长度为3的整型数组的引用。假设你创建一个长度为10的整型数组,也是相同的 —— 分配内存,返回一个引用。

one-dimension-array-in-java.png

2.二维数组

二维数组是怎么样的呢?实际上,在Java中我们只有一维数组。二维数组本质上也是一维数组,只是数组中的每一个元素都指向了另一个一维数组。

int[ ][ ] arr = new int[3][ ];
arr[0] = new int[3];
arr[1] = new int[5];
arr[2] = new int[4];

Array-in-Memory-Java.png

多维数组也是使用一样的规则。

3. 它们位于内存中什么地方?

在Java中,数组也是对象,所以一个对象在内存中的结构适用于数组。

我们知道JVM运行时数据区包括堆,JVM栈,以及其他。对于如下一个简单的例子,让我们来看看数组和它的引用的存储位置。

class A {
int x;
int y;
}

...

public void m1() {
int i = 0;
 m2();
}

public void m2() {
 A a = new A();
}

...

从上面的代码中,让我们执行下m1()方法看看发生了什么:

  1. 当m1被调用的时,一个新的帧(Frame-1)被压入栈中,局部变量i也被创建在(Frame-1)里。
  2. 然后m2在m1内部被调用,另外一个新的帧(Frame-2)被压入栈中。在m2中,一个class A的对象被创建在堆中,引用变量被放到(Frame-2)里。此时,栈和堆如下所示:

Java-array-in-memory.png

数组和对象是以相同的方式处理,所以读者也会明白数组在内存中是如何存储。

阅读更多

没有更多推荐了,返回首页