译自:programcreek
Java中的数组存储两种东西之一:要么是原始值(int, char, ...),或是引用(即指针)。
当一个对象通过"new"创建时,将会在堆内存分配空间,并且返回一个引用。这对于数组也是一样的,因为数组是对象。
1.一维数组
int arr[] = new int[3];
int[] arr 只是长度为3的整型数组的引用。假设你创建一个长度为10的整型数组,也是相同的 —— 分配内存,返回一个引用。
2.二维数组
二维数组是怎么样的呢?实际上,在Java中我们只有一维数组。二维数组本质上也是一维数组,只是数组中的每一个元素都指向了另一个一维数组。
int[ ][ ] arr = new int[3][ ];
arr[0] = new int[3];
arr[1] = new int[5];
arr[2] = new int[4];
多维数组也是使用一样的规则。
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()方法看看发生了什么:
- 当m1被调用的时,一个新的帧(Frame-1)被压入栈中,局部变量i也被创建在(Frame-1)里。
- 然后m2在m1内部被调用,另外一个新的帧(Frame-2)被压入栈中。在m2中,一个class A的对象被创建在堆中,引用变量被放到(Frame-2)里。此时,栈和堆如下所示:
数组和对象是以相同的方式处理,所以读者也会明白数组在内存中是如何存储。