Java中的數組存儲兩類事物: 原始值(int,char,...),或者引用(對象指針).
當一個對象通過 new 創建,那么將在堆內存中分配一段空間,並且返回其引用(指針).
對於數組,也是同樣的方式.
1. 一維數組
- int arr[] = new int[3];
int[] arr 指向 包含3個整數的數組. 假設創建的是包含10個整數的數組,也是同樣的用法 —— 分配指定大小的內存,並返回數組的引用。

圖1
2. 二維數組
二維數組又有什么區別呢?實際上,在Java中只有一維數組。二維數組本質上也是一維數組,只是數組中的每一個元素都指向了另一個一維數組而已。
- int[ ][ ] arr = new int[3][ ];
- arr[0] = new int[3];
- arr[1] = new int[5];
- arr[2] = new int[4];

圖2
同樣的原理,多維數組也是如此.
3. 數組分配在內存的哪個區域?
數組存放在堆中
Java中的數組,也是對象(繼承Object),因此數組所在的區域和對象是一樣的.
我們知道, 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)被壓入JVM棧中,當然,相關的局部變量也在 Frame-1中創建,比如 i;
- 然后 m1調用m2,,又有一個新的棧幀(Frame-2)被壓入到JVM棧中; m2方法在堆內存中創建了A類的一個對象,此對象的引用保存在 Frame-2的局部變量 a 中. 此時,堆內存和棧內存看起來如下所示:

圖3
而 數組(Array)被當做Object處理,因此數組如何保存的,你應該明白了.
