Java 二維數組本質是「數組的數組」,聲明時僅分配第一維引用,第二維需單獨 new。本文通過楊輝三角生成代碼,詳細解析不規則二維數組的內存結構與初始化流程。
int[][] arr = new int[n][]; // 分配 n 個引用,值為 null
for (int i = 0; i < n; i++) {
arr[i] = new int[i + 1]; // 為每行動態分配不同長度
arr[i][0] = arr[i][i] = 1; // 兩邊為 1
for (int j = 1; j < i; j++) {
arr[i][j] = arr[i-1][j] + arr[i-1][j-1]; // 內部值 = 上兩數之和
}
}
arr (引用變量) → [引用0] → [1]
→ [引用1] → [1, 1]
→ [引用2] → [1, 2, 1]
→ [引用3] → [1, 3, 3, 1]
...
每行長度不同,內存不連續,靈活節省空間
new int[n][]:在堆上創建長度為 n 的引用數組,每個元素初始化為 nullarr[i] = new int[i+1]:為第 i 行單獨分配基本類型數組,長度 i+1arr[i][j]:先取 arr[i] 引用,再取該數組下標 jNullPointerException
// 一次性分配連續內存
int[][] regular = new int[3][4]; // 3行4列,所有行長度固定
// 等價於
int[][] regular = new int[3][];
for (int i = 0; i < 3; i++) regular[i] = new int[4];
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) { // 必須用 arr[i].length
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
注意:不能用固定長度遍歷,每行 length 可能不同。