1. 介紹
把一維陣列想像成一個長長的披薩盒,所有切片排成一列——好吃,但有點單調。
再想像一下行程表或西洋棋棋盤。其中一切都被組織成 列 與 欄——也就是一個 表格。這正是二維陣列的經典任務。
在真實世界中,二維陣列隨處可見:
- 員工薪資表(列=員工,欄=月份)。
- 螢幕上的圖片(每個「格子」是像素顏色,具有兩個座標:X 與 Y)。
- 矩陣運算與資料處理。
- 西洋棋棋盤或井字遊戲的棋盤。
有時二維陣列也被稱為 矩陣(這個名稱來自數學)。
身為程式設計師,你會在許多地方需要二維陣列。幾乎任何桌上遊戲的實作,都是現成的二維陣列:「西洋棋」、「跳棋」、「井字遊戲」、「海戰棋」:

像「西洋棋」或「海戰棋」的棋盤,天生就對應二維陣列,格子的座標只需使用數字即可。不是「兵 e2 ⟶ e4」,而是「兵 (4,1) ⟶ (4,3)」。對程式設計師來說反而更簡單。
2. 二維陣列的宣告語法
在第一次宣告之前看起來有點可怕!我們一步一步來。
一般規則
type[][] arrayName;
這裡有兩組空的 [] 方括號——不是編譯器熬夜喝咖啡後的失誤,而是用來表示:這是二維。
範例
int[][] matrix;
double[][] gradesTable;
string[][] chessBoard;
建立陣列
先指定大小:列 的數量與 欄 的數量。
matrix = new int[3][4]; // 3 列,4 欄
這是一個 3×4 的小表格:想像成一張有 3 列與 4 欄的 Excel 表。
也可以同時宣告變數並建立二維陣列:
int[][] matrix = new int[3][4];
也可以直接用值初始化(和一維陣列很像):
int[][] example = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// 表格 3 列、3 欄
視覺示意
┌─────┬─────┬─────┬─────┐
│ 0 │ 1 │ 2 │ 3 │ ← 欄 (Columns)
├─────┼─────┼─────┼─────┤
│ 0,0 │ 0,1 │ 0,2 │ 0,3 │ ← 第 0 列 (Row 0)
├─────┼─────┼─────┼─────┤
│ 1,0 │ 1,1 │ 1,2 │ 1,3 │ ← 第 1 列 (Row 1)
├─────┼─────┼─────┼─────┤
│ 2,0 │ 2,1 │ 2,2 │ 2,3 │ ← 第 2 列 (Row 2)
└─────┴─────┴─────┴─────┘
每個元素由一對索引 [row, column] 指定。
3. 索引與元素存取
在二維陣列中,存取元素需要提供 兩個索引:
- 第一個——列索引。
- 第二個——欄索引。
// 在第 2 列(索引 1)、第 3 欄(索引 2)
matrix[1][2] = 99;
提醒一下:索引從零開始。也就是說,第一個元素是 [0][0]。
寫入與讀取
int[][] data = new int[5][2];
data[1][1] = 5; // 寫入
int value = data[1][1]; // 讀取
在記憶體中的樣子如下:

4. 填充二維陣列
我們來寫段程式碼,把矩陣用從 1 到 12 的連續數字填滿,好更直觀地了解它如何運作。
int[][] matrix = new int[3][4];
int value = 1;
for (int row = 0; row < 3; row++)
{
for (int col = 0; col < 4; col++)
{
matrix[row][col] = value;
value++;
}
}
示意:
執行後:
┌────┬────┬────┬────┐
│ 1 │ 2 │ 3 │ 4 │
├────┼────┼────┼────┤
│ 5 │ 6 │ 7 │ 8 │
├────┼────┼────┼────┤
│ 9 │ 10 │ 11 │ 12 │
└────┴────┴────┴────┘
5. 二維陣列的內部結構
接下來你將看到二維陣列真正的樣貌。準備好了嗎?
二維陣列其實是陣列的陣列!
換句話說,一維陣列是「變數(陣列)持有指向裝著陣列元素的容器的參考」;而對二維陣列來說,情況更進一步:二維陣列變數持有對一個容器的參考,而那個容器的每個格子又存放指向一維陣列的參考。看圖比解釋一百次還清楚:

左邊是「二維陣列變數」,它持有指向「二維陣列物件」的參考。中間是「二維陣列物件」,其格子中存放著一維陣列(也就是二維陣列的各列)的參考。而在右邊你會看到四個一維陣列——我們的二維陣列的各列。
這就是二維陣列的真實結構。這種做法給 Java 開發者帶來幾個優勢:
首先,因為「容器的容器」存的是「列陣列」的參考,我們可以非常快速且簡單地對調列。若要存取「容器的容器」,只要提供一個索引即可。範例:
int[][] data = new int[2][5];
int[] row1 = data[0];
int[] row2 = data[1];
用下面這段程式碼可以把列互換:
// 重要資料的矩陣
int[][] matrix = {
{1, 2, 3, 4, 5},
{5, 4, 3, 2, 1}
};
int[] tmp = matrix[0];
matrix[0] = matrix[1];
matrix[1] = tmp;
如果在存取二維陣列時,在陣列名後只寫一個索引,你取到的是外層容器,其格子中放的是一般一維陣列(各列)的參考。
6. 將二維陣列輸出到畫面
要把二維表格輸出到主控台,通常會使用巢狀迴圈——就像在主控台裡畫迷宮。範例:
for (int row = 0; row < matrix.length; row++)
{
for (int col = 0; col < matrix[row].length; col++)
{
System.out.print(matrix[row][col] + "\t");
}
System.out.println(); // 換到新的一行
}
輸出範例:
1 2 3 4
5 6 7 8
9 10 11 12
順帶一提,你現在已經學會只用幾行程式碼就能漂亮地「畫」出表格了!
GO TO FULL VERSION