二維數組本質是「數組的數組」。Java 中使用 [][] 聲明,支持聲明時靜態初始化、動態分配行列、以及不規則(鋸齒)數組創建。
// 1. 聲明並動態分配固定行列
float[][] matrix = new float[5][5]; // 5行5列
matrix[0][0] = 1.1f;
// 2. 聲明不規則數組:先定行數,再逐行分配列數
long[][] jagged = new long[5][]; // 5行,每行列數待定
jagged[0] = new long[5]; // 第1行5列
jagged[1] = new long[3]; // 第2行3列
// ...
// 3. 靜態初始化:聲明同時賦值(規則數組)
double[][] data = {
{1.111, 2.222, 3.333},
{4.444, 5.555, 6.666}
};
// 4. 靜態初始化:不規則數組
int[][] irregular = new int[][] {
{10, 20, 30},
{40, 50},
{60}
};
new int[3][4] 在堆中創建:
不規則數組 new int[3][] 僅創建主數組,子數組為 null,需逐個 new 分配。
int[][] arr = {{1,2,3},{4,5},{6,7,8,9}};
// 方式一:雙重 for 循環(需處理不規則長度)
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
// 方式二:增強 for 循環(更簡潔)
for (int[] row : arr) {
for (int val : row) {
System.out.print(val + " ");
}
System.out.println();
}
int[][] a = new int[3][]; 直接訪問 a[0][0] 拋出 NPE,因子數組未初始化。int[][] copy = arr.clone(); 僅複製主數組引用,修改 copy[0][0] 會影響原數組。深拷貝需逐行 Arrays.copyOf 或手動循環複製。new int[100000][100000] 直接導致堆內存溢出,需分塊處理或使用稀疏矩陣結構。List<List<T>> 或 ArrayList<ArrayList<T>> 替代原始二維數組,獲得動態擴容、泛型安全、豐富 API。int[] flat = new int[rows * cols] 配合索引計算 flat[row * cols + col] 消除多層引用開銷。