1. 陣列是元素的容器
你大概聽過,電腦可以處理龐大的資訊量。條件運算子(if-else)與迴圈(for、while)確實能幫上忙。但光靠它們還不夠,因為資料也得有地方儲存。
為此,Java(以及幾乎所有程式語言)都提供了一個很棒的機制:陣列(Array)。它們有時也被稱為表格。
陣列是一種特殊的物件,可以儲存的不是單一值,而是多個值。

如果把變數比喻成一個可以放入某個值的盒子,那麼陣列更像是內部被分成多個區隔的盒子。每個區隔在「盒子(陣列)」裡都有自己的編號。編號當然是從 0 開始……
也可以再換個比喻:把獨棟住宅和公寓大樓相比。獨棟房子只住一個家庭,而大樓被分成許多公寓。要寄信給住在獨棟的人,只需寫上獨一無二的地址;要寄信給住在公寓的人,除了大樓的唯一地址外,還要寫上門牌(公寓)號碼。
同理,陣列變數就像一棟公寓大樓。它不只可以儲存一個值,而是多個值。這個變數內有多個「公寓」(元素),並且可以透過每個元素的編號(索引)來存取它。
為此,在變數名稱後的方括號內指定要存取的元素索引即可。這相當簡單:
array[indeks] = znachenie;
其中,array 是陣列變數的名稱,indeks 是陣列元素的索引(編號),而 znachenie 是要寫入該元素的值。
不過,先來看看要如何建立陣列。
2. 在 Java 中建立陣列

假設你的程式需要儲存 100 個整數。使用陣列就很合適。那要怎麼建立呢?
如果只想儲存一個整數,我們會用 int 型別;若要儲存100 個整數,顯然需要一個 int 型別的陣列。建立它的程式碼如下:
int[] array = new int[100];
我們來拆解一下這段程式碼在做什麼。
如你所料,等號左側是名為 array、型別為 int[] 的變數宣告。在 int 之後的方括號提示我們:這種「盒子」可以放的不只是單一值,而是多個值。
等號右側寫的是「建立物件」(關鍵字 new),用來建立一個包含 100 個 int 元素(儲存格)的陣列。其實不難。
如果我們想建立一個20 個元素的陣列來存放浮點數,它可能會長這樣:
double[] vals = new double[20];
陣列中元素的數量稱為陣列大小或陣列長度。由於能儲存多個值,陣列也常被稱為容器。
重要事項: 陣列容器的大小在建立後無法變更。
你可以建立新的陣列,但無法修改既有陣列的長度。
3. 與陣列元素互動

好,建立陣列會了,那要如何正確地使用它們呢?
幾乎就像一般變數一樣,只是存取陣列變數時,必須在名稱後面加上要操作元素的索引。
陣列元素的索引一律從 0 開始。 若陣列有 10 個元素,索引為 0..9;若有 200 個元素,則為 0..199。以此類推。
範例:
int[] a = new int[10]; // 建立一個包含 10 個 int 的陣列。
a[2] = 4; // 在索引為 2 的位置寫入值 4。
a[7] = 9; // 在索引為 7 的位置寫入值 9。
a[9] = a[2] + a[5]; // 在索引為 9 的位置寫入第 2 與第 5 個元素的和
// (第 2 個為 4)以及第 5 個(為 0)。
執行上述程式後,記憶體中的內容如下:

陣列左側(灰色)欄是元素的編號(索引)。在對應元素中儲存了我們寫入的值:4、9 和 4。剛建立陣列時,元素會以 0 初始化。
重要: 陣列中的所有元素都有相同的資料型別。如果建立的是 String 陣列,就只能在元素中存放字串。陣列的資料型別在建立時決定,之後無法變更型別或長度。
4. 記憶體中的陣列
前面圖示有點簡化了。
建立陣列(就像建立字串)時,在記憶體中其實會配置兩塊區域:一塊用來存放陣列(容器)本身,另一塊是存放其位址的變數。更精確的情況如下圖:

綠色部分是包含 10 個 int 元素的陣列,以及一個型別為 int[] 的變數,用來保存指向該 int 陣列在記憶體中的位址(參考)。
作為對照,藍色表示的是一個普通的 int 變數,儲存的值是 199。
是不是讓你想起字串在記憶體中的儲存方式?
沒錯,字串也是如此。同樣地,「陣列型別的變數」也可以彼此賦值:
int[] a = new int[10]; // 建立一個包含 10 個 int 的陣列。
a[2] = 4; // 在索引為 2 的位置寫入值 4。
a[7] = 9; // 在索引為 7 的位置寫入值 9。
int[] b = a; // 將變數 a 中的位址指派給變數 b。
// 現在 a 與 b 都指向記憶體中的同一個陣列物件。
a[9] = b[2] + a[7]; // 在索引為 9 的陣列元素寫入值:
// 第 2 與第 7 個元素的和(分別為 4 與 9)。
在這過程中,陣列物件會留在原處,而變數 a 與 b 會保存相同的位址(參考)指向同一個物件。請看下圖:

5. 更深入地操作陣列
可以用任何型別來建立陣列,只要在型別名稱後面加上方括號。建立陣列的一般形式如下:
tip[] imya = new tip[kolichestvo];
其中,tip 是我們要儲存在陣列中的元素型別;Imya 是之後存取該陣列用的變數名稱;而 kolichestvo 是陣列的元素數量。
上面的例子展示的是標準形式:同時宣告陣列變數並建立陣列物件。其實這是兩個獨立的動作。也可以分別宣告變數與建立陣列物件:
tip[] imya;
imya = new tip[kolichestvo];
再說一個重要細節
作為陣列的索引與陣列的元素數量,都可以使用變數,甚至是整數運算式。
範例:
int n = 100;
int[] a = new int[n]; // 建立一個有 n 個元素的陣列
int n = 100;
int[] a = new int[n * 2 + 3]; // 建立一個長度為 203 的陣列
int n = 100;
int[] a = new int[n];
a[n-1] = 2; // a[99] = 2;
a[n-2] = 3; // a[98] = 3;
a[n/5] = a[n-1] + a[n-2] // a[20] = a[99] + a[98];
陣列越界
順帶一提,如果嘗試用不存在的索引來存取陣列元素(在我們的例子中,就是除了 0..99 以外的整數),程式會以 ArrayIndexOutOfBoundsException(索引超出陣列範圍)錯誤而異常終止。
6. 陣列長度
如同我們在前一個例子所見,可以先宣告一個陣列型別的變數,之後再在程式的某處將它指向某個(陣列)物件。甚至可以這樣做:
int[] array; // 宣告一個 int[] 型別的陣列變數
if (a < 10) // 如果變數 a 小於 10,
array = new int[10]; // 就建立一個有 10 個元素的陣列。
else // 否則
array = new int[20]; // 建立一個有 20 個元素的陣列
那接下來如何使用這樣的陣列?要如何知道它有多少個元素?
為此,陣列提供了一個特殊的屬性 — length。可以用下列表示式取得陣列長度:
array.length;
其中 array 是陣列變數名稱,而 length 是陣列物件的屬性。length 的值無法被修改:你可以把 length 的值指派給其他變數,但不能對它賦予新值(否則程式無法編譯)。
可以這樣延續前面的範例:
int[] array; // 宣告一個 int[] 型別的陣列變數
if (a < 10) // 如果變數 a 小於 10,
array = new int[10]; // 就建立一個有 10 個元素的陣列。
else // 否則
array = new int[20]; // 建立一個有 20 個元素的陣列
for (int i = 0; i < array.length; i++) // 遍歷陣列所有元素的迴圈:從 0 到 array.length - 1
{
System.out.println(array[i]);
}
7. Java 陣列重點
讓我們總結一下關於陣列的重點:
- 重點 1. 陣列由多個元素組成。
- 重點 2. 存取特定元素需要指定它的索引。
- 重點 3. 所有元素的型別相同。
- 重點 4. 元素的初始值:數值型為 0,若元素存的是位址則為 null,false(對於 boolean 型別)。
- 重點 5. String[] list 只是變數宣告:容器(陣列物件)本身尚未建立。要能使用它,必須先建立陣列(容器)並把它放進這個變數中,之後才能使用。見下例。
- 重點 6. 建立陣列物件(容器)時,必須指定它的長度(元素個數)。寫法為:new TypeName[n];
- 重點 7. 可以透過 .length 屬性取得陣列長度。
- 重點 8. 陣列建立後,不能更改元素的型別或元素的數量。
String s; // s 為 null
String[] list; // list 為 null
list = new String[10]; // 變數 list 會保存對一個字串陣列(10 個元素)的參考。
int n = list.length; // n 為 10
list = new String[0]; // 現在 list 參考的是一個長度為 0 的陣列。
// 陣列存在,但無法存任何元素。
list = null;
System.out.println(list[1]); // 將會拋出錯誤 — 程式異常終止。
// list 是空參考 — null
list = new String[10];
System.out.println(list[10]); // 將會拋出錯誤 — 陣列越界。
// 如果 list 有 10 個元素,允許的索引是:0 1 2 3 4 5 6 7 8 9(共 10 個)。
GO TO FULL VERSION