原文链接:What does a Java array look like in memory?
Java中的数组要么存储基本数据的值(int,char,…)要么存储引用(又名指针),二选其一。
当一个对象通过使用“new”创建时,就会在堆中分配内存并返回一个引用。这对于数组而言是一样的,因为数组也是对象。
1.一维数组
int arr[] = new int[3];
int[] arr仅仅是指向三个整数的数组的一个引用。如果你创建一个十个整数的数组,也是一样——指定一个数组并返回一个引用。
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()然后看看发生了什么:
1.当m1()被调用的时候,一个新的框(Frame-1)被压入栈中,然后,局部变量i也在Frame-1中创建。
2.m2()在m1()中被调用,另一外新的框(Frame-2)被压入栈中。在m2中,在堆中创建了A类的一个对象,然后它的引用变量被放到Frame-2中。现在,这时候栈和堆看起来就像下面这样:
数组就像对象一样,以同样的方式被处理,因此数组如何在内存中存入就非常简单了。