在java中数组有两种存储类型,一种是原始值(int,char等)或者是引用类型(或者叫指针)。
当一个对象通过new被创建时,会在堆上分配内存并返回引用,这对数组也是成立的,因为数组也是对象。
一维数组
int arr[] = new int [];
这个int[] arr 只是类型为Integer,个数为3的数组的引用。如果你创建了10个整型的数组,它是同一个数组被分配,并返回引用。
二维数组
二维数组是什么样子的呢,实际上,在java中只有一维数组,二维数组基本上只是一维数组的数组
int[ ][ ] arr = new int[3][ ];
arr[0] = new int[3];
arr[1] = new int[5];
arr[2] = new int[4];
对于多维数组也是如此
他们在内存中是怎么被分配的呢
在java中万事万物皆对象,不例外,数组在java中也是对象,那么在内存中对象是如何在数组中应用的呢
我们知道,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)被压入到栈里边,同时在Frame-1中局部变量也被创建。然后m2()在m1()中被调用,另一个新的(Frame-2)也被压入栈,在m2中,在堆中classA的对象被创建,同时引用变量也放在了Frame-2中,到现在为止,栈和堆的形态如下:
数组的创建过程和对象的一样,所以数组在内存中是如何的就一目了然了。