Java 陣列初始化說明:初學者與中階開發者完整指南

1. 介紹

陣列是 Java 程式設計中一種基本的資料結構,當您想要一起管理多個相同類型的數值時非常有用。例如,使用個別變數來管理 10 個不同的分數或大量資料是不切實際的。這就是陣列派上用場的地方。

本文重點介紹如何在 Java 中初始化陣列,以清晰且適合初學者的方式說明。如果您正在想「什麼是陣列?」或「如何初始化陣列?」,本指南涵蓋從基礎到進階技巧的一切。請務必讀到最後。

閱讀本文,您將獲得以下益處:

  • 了解宣告和初始化陣列的完整過程
  • 避免常見錯誤和典型的初始化錯誤
  • 學習在實際開發中有用的實用程式碼範例

本內容不僅適合程式設計初學者,也適合想要複習 Java 基礎知識的人。
現在,讓我們從學習 Java 中陣列的基本知識開始。

2. Java 中的陣列基礎

如何宣告陣列和基本語法

在 Java 中使用陣列,第一步是宣告陣列。宣告告訴程式,「這個變數將用作儲存多個數值的陣列。」宣告陣列有幾種方式,但最常見的兩種是:

int[] numbers;       // Recommended style
int numbers[];       // C-style syntax

Java 中偏好的風格是 int[] numbers;,其中 [] 跟在類型名稱後。此記法清楚表示「int 的陣列。」

陣列大小和初始化的重要性

宣告後無法立即使用陣列。要實際使用它,您必須透過指定陣列應有幾個元素(或「槽位」)來初始化它。
初始化會為指定的元素數量分配記憶體,並使陣列可用。

例如,初始化一個五個整數的陣列:

int[] scores = new int[5];

此程式碼分配五個連續的整數元素,可從 scores[0]scores[4] 存取。
在 Java 中,陣列的大小必須在初始化時指定,且之後無法變更。這是初學者常見的錯誤來源。

陣列類型和預設值

陣列的類型決定每個元素的類型。例如,int[] 是整數陣列,String[] 是字串陣列。
在 Java 中,當陣列初始化時,每個元素會根據其類型自動接收預設值

預設值的範例:

  • int → 0
  • double → 0.0
  • boolean → false
  • 參考類型(例如 String)→ null

因此,Java 中的陣列需要兩個步驟:「宣告」和「初始化」,這兩個步驟在您的程式設計之旅早期了解至關重要。

3. 初始化陣列的方法

Java 提供幾種初始化陣列的方式。最佳方法因程式的需求而異,因此了解每種方法如何運作很重要。

3.1 在宣告時初始化陣列

最簡單且最直觀的方法是在宣告陣列時直接提供初始值。當值是固定的且事先已知時,這特別有用。

int[] numbers = {1, 2, 3, 4, 5};
String[] fruits = {"apple", "banana", "orange"};

無需 new 關鍵字或大小指定。Java 會自動建立具有提供元素數量的陣列。

3.2 使用 new 關鍵字初始化

下一個常見方法是使用new 關鍵字指定陣列大小

int[] scores = new int[5];  // Five integers (default value: 0)
String[] names = new String[3]; // Three Strings (default value: null)

在這種初始化模式中,所有元素會自動指派預設值。

  • 數值類型:0 或 0.0
  • boolean:false
  • 參考類型:null

當陣列大小已知但值稍後才會被指派時,此方法非常理想。

3.3 使用 Arrays.fill() 初始化陣列

如果您想將 所有陣列元素初始化為相同的值Arrays.fill() 方法非常有用。
例如,將陣列填入值 7:

import java.util.Arrays;

int[] data = new int[5];
Arrays.fill(data, 7);  // All elements become 7

此方法比起使用迴圈手動指派相同的值更有效率。

3.4 使用迴圈初始化陣列

當每個陣列元素需要 不同的值 或遵循特定模式時,使用 for 迴圈 是標準做法。

int[] squares = new int[5];
for (int i = 0; i < squares.length; i++) {
    squares[i] = i * i;  // 0, 1, 4, 9, 16
}

請注意,加強版的 for 迴圈(for-each)適合用來讀取值,但不適合依索引指派值。

如您所見,Java 提供多種初始化技巧——請選擇最符合您特定情境的方法。

4. 陣列初始化的重要注意事項

在使用陣列時,除了了解初始化方法外,掌握 常見的陷阱與典型錯誤 也相當重要。了解這些可以避免錯誤與意外行為。

使用未初始化陣列所導致的錯誤

陣列在正確初始化之前無法使用。若嘗試使用僅宣告卻未初始化的陣列,會拋出 NullPointerException

int[] numbers;
System.out.println(numbers[0]); // Error: numbers is not initialized

為避免此錯誤,務必記得「宣告」與「初始化」必須同時完成。

避免 ArrayIndexOutOfBoundsException

若嘗試存取超出陣列有效範圍的索引,Java 會拋出 ArrayIndexOutOfBoundsException
陣列索引始終從 0 開始,直到 陣列長度 – 1 為止。

int[] data = new int[3];
data[3] = 10; // Error: index 3 does not exist (valid: 0, 1, 2)

在迭代陣列時,請始終使用 arrayName.length 以確保安全存取。

for (int i = 0; i < data.length; i++) {
    // Safe access
}

使用初始化列表({})的限制

初始化列表 {} 只能在 宣告時 使用。
它無法用於已宣告的陣列:

int[] numbers;
numbers = {1, 2, 3}; // Error: initializer list cannot be used here

相反地,必須結合 new 關鍵字使用:

numbers = new int[]{1, 2, 3}; // Correct usage

陣列大小無法變更

一旦初始化後,Java 陣列的大小 無法更改
若要增加元素數量,必須建立新陣列並將值複製過去。

了解這些限制有助於避免常見的陣列相關錯誤。

5. 進階主題:初始化多維陣列

Java 中的陣列可以是多維的。二維陣列 特別適用於類似矩陣或表格的資料。以下說明如何初始化多維陣列,主要聚焦於二維陣列。

宣告與初始化二維陣列

二維陣列本質上是「陣列的陣列」。您可以在宣告時或使用 new 關鍵字來初始化。

宣告時初始化

int[][] matrix = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};

這會建立一個 3×3 的整數二維陣列。

使用 new 初始化

int[][] table = new int[2][3]; // Creates a 2×3 array

所有元素預設會被初始化為 0。
您也可以稍後設定值:

table[0][0] = 10;
table[0][1] = 20;
table[1][2] = 30;

建立鋸齒(不規則)陣列

Java 允許「鋸齒狀陣列」,每一列可以有不同數量的欄位。

int[][] jagged = new int[3][];
jagged[0] = new int[2]; // Row 1 has 2 columns
jagged[1] = new int[4]; // Row 2 has 4 columns
jagged[2] = new int[1]; // Row 3 has 1 column

多維陣列初始化說明

  • 二維陣列也會根據其元素類型取得預設值(例如,int → 0,String → null)。
  • 使用 new int[rows][columns] 時,必須先指定第一維(列數)。
  • 使用未初始化的列會導致 NullPointerException

Java 在多維陣列的初始化方式上提供彈性,取決於您需要的結構。

6. 小結

我們已經從基礎到進階技巧完整說明了在 Java 中初始化陣列的方式。讓我們回顧重點。

陣列初始化的重點

  • 使用前務必先宣告並初始化陣列
  • 未初始化的陣列會導致錯誤,例如 NullPointerException。
  • 依情況選擇適當的初始化方式
  • 當值固定時使用初始化列表,僅知道大小時使用 new,要設定相同值時使用 Arrays.fill(),而需要不同值時則使用迴圈。
  • 注意索引界限
  • 陣列索引從 0 開始,超出範圍的存取會拋出例外。
  • 多維陣列遵循與一維陣列相同的基本規則
  • 鋸齒狀陣列允許每列長度不同。

給初學者的建議與後續步驟

了解陣列初始化是建立 Java 程式設計堅實基礎的重要環節。先從簡單的一維陣列開始,熟練後再進一步學習多維陣列與基於陣列的邏輯。

此外,Java 也提供功能強大的「動態陣列」如 ArrayList。在掌握基本陣列後,學習 Java 的集合框架是自然的下一步。

下一章將彙總有關陣列初始化的常見問題(FAQ)。若有任何疑問,請務必檢視相關的問答。

7. 常見問題(FAQ)

以下針對 Java 中陣列初始化的常見問題與易混淆之處作說明。

Q1. 我可以在之後改變陣列的大小嗎?
A. 不能。Java 陣列在初始化後大小即固定。若需要不同的大小,必須建立新陣列並複製值。若需要可變大小的結構,請考慮使用 ArrayList

Q2. 如果使用未初始化的陣列會發生什麼事?
A. 使用已宣告但未初始化的陣列會拋出 NullPointerException。使用前務必以 new 或初始化列表進行初始化。

Q3. Arrays.fill() 與 for 迴圈有何差異?
A. Arrays.fill() 會將所有元素設定為相同的值,而 for 迴圈則可為每個元素指定不同的值。

Q4. 陣列的預設值如何分配?
A. 使用 new 時會自動分配預設值:int → 0,double → 0.0,boolean → false,參考型別 → null。

Q5. 二維陣列的列可以有不同長度嗎?
A. 可以。Java 支援鋸齒狀陣列,每列的欄位數可以不同,但每列在使用前必須先初始化。

Q6. 如何複製陣列?
A. 可使用 System.arraycopy()Arrays.copyOf() 等方法。雖然手動使用迴圈也能複製,但內建方法更簡潔且更安全。

Q7. 陣列與 ArrayList 有何不同?
A. 陣列大小固定且只能容納單一類型,而 ArrayList 支援動態調整大小,且提供彈性的操作。

希望本 FAQ 能解答您在 Java 陣列初始化方面的常見疑問。