在 Java 中,數組被視為對象,因此其內存分配遵循對象的規則。當使用 new 關鍵字創建數組時,JVM 會在堆內存中分配連續的內存空間,並返回該數組對象的引用。Java 支持兩類數組:基本類型數組(如 int[])和引用類型數組(如 String[])。無論哪種類型,數組本身都是堆上的對象。
以 int[] arr = new int[3]; 為例,變量 arr 存儲在棧幀中,指向堆中一個長度為 3 的 int 數組對象。數組對象包含長度屬性和連續的元素存儲區。若創建 new int[10],同樣在堆上分配一個可容納 10 個 int 值的連續內存塊。

Java 沒有真正意義上的多維數組,二維數組本質上是「數組的數組」。例如:
int[][] arr = new int[3][]; arr[0] = new int[3]; arr[1] = new int[5]; arr[2] = new int[4];
這裡 arr 引用一個長度為 3 的一維數組,其每個元素又分別引用另一個一維數組。各行長度可以不同,形成「鋸齒數組」。多維數組同理,層層引用。

Java 運行時數據區主要包括堆、JVM 棧、方法區等。數組對象存放在堆中,引用變量存放在棧幀的局部變量表中。以如下代碼為例:
class A { int x; int y; }
public void m1() { int i = 0; m2(); }
public void m2() { A a = new A(); }
調用 m1() 時,棧幀 Frame-1 入棧,局部變量 i 存入其中;隨後調用 m2(),棧幀 Frame-2 入棧,new A() 在堆中創建對象,引用 a 存入 Frame-2。數組作為對象,其內存分佈模式完全一致。

理解數組在內存中的存儲方式,有助於優化性能、排查 OutOfMemoryError 以及編寫高效的數組操作代碼。