[译]内存中的Java数组是怎么样的

(文章翻译自What does a Java array look like in memory?
Java中的数组存储了两个中的一个类型:原始类型的类或则是引用类型(比如指针)

当一个对象通过New创建的 时候,将会在堆内存分配空间并且返回了引用。因为数组也是对象所以这个对数组来说也是适用的。

1.一维数组

int arr[] = new int[3];

int[] arr只是拥有三个整形对象的数组的引用。如果你你创建了一个拥有十个对象的数组,也是相同的方式数组被创建然后返回一个引用。
one-dimension-array-in-java

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

多维数组也是适用相同的规则。

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)被放到了栈中,而且局部变量也被创建在(Frame-1)中。

2.然后m2在m1内部被调用,另外一个新的帧(Frame-2)被放到了栈中。在m2中,一个对象A被创建在堆中而且引用变量被放到了(Frame-2) 中。现在,在这个点上,栈和堆像下面一样:
Java-array-in-memory

数组和和对象一样被同样的方式对待,所以为什么在内存中分配是直接的。

posted on 2015-01-09 17:37  叼烟斗的纤夫  阅读(268)  评论(0编辑  收藏  举报