Thinking in Java(4-5) 陣列宣告與初始化

Thinking in Java(4-5) 陣列宣告與初始化
Photo by orbtal media / Unsplash

在 Java 程式設計中,陣列(Array)是一種用於存儲相同型態資料的結構,無論是基本型態還是物件參考。本篇文章將詳細探討陣列的宣告、初始化以及動態建立的方法,並介紹如何在方法中使用陣列。

陣列的宣告與初始化

宣告陣列

在 Java 中,宣告一個陣列只需在型態名稱後面加上方括號 []

int[] a1;

也可以將方括號放在變數名稱後面,兩種方式效果相同:

int a1[];
注意:編譯器不允許在陣列宣告時指定大小,因為此時僅宣告了一個對陣列的參考,並未實際分配任何空間。例如,int a1[5]; 這樣的宣告在 Java 中是不合法的。

初始化陣列

要創建陣列並分配記憶體空間,需要使用初始化表達式。初始化可以在宣告後的任何地方進行,只要在變數使用前完成即可。

使用大括號 {} 可以直接初始化陣列,這種方式也稱為「匿名陣列」初始化,編譯器會自動處理陣列的大小和元素:

int[] a1 = {1, 2, 3, 4, 5};

陣列的參考與修改

在 Java 中,可以將一個陣列參考賦值給另一個陣列參考,實際上是複製了參考,兩者指向同一個陣列物件:

int[] a2;
a2 = a1;

範例:

public class ArraysOfPrimitives {
  public static void main(String[] args) {
    int[] a1 = { 1, 2, 3, 4, 5 };
    int[] a2;
    a2 = a1;
    for(int i = 0; i < a2.length; i++)
      a2[i] = a2[i] + 1;
    for(int i = 0; i < a1.length; i++)
      System.out.println("a1[" + i + "] = " + a1[i]);
  }
} /* Output:
a1[0] = 2
a1[1] = 3
a1[2] = 4
a1[3] = 5
a1[4] = 6
*/
提示:所有陣列都有一個內建的屬性 length,可以用來獲取陣列的長度,但不能修改它。陣列的索引從 0 開始,最大索引為 length - 1。如果超出這個範圍,會引發運行時錯誤。

陣列的動態建立與自動初始化

當在編寫程式時不確定需要多少元素時,可以使用 new 關鍵字動態建立陣列。

  • 基本型態陣列:會自動初始化為預設值(如 int 型態為 0)。
  • 物件型態陣列:元素初始化為 null

範例:

public class ArrayNew {
  public static void main(String[] args) {
    int[] a;
    Random rand = new Random(47);
    a = new int[rand.nextInt(20)];
    System.out.println("length of a = " + a.length);
    System.out.println(Arrays.toString(a));
  }
} /* Output:
length of a = 18
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
*/
  • 在這個範例中,陣列的大小透過 Random.nextInt() 隨機決定。
  • 基本型態的陣列元素自動初始化為 0
  • 你也可以在宣告的同時初始化:int[] a = new int[rand.nextInt(20)];

如果建立了一個非基本型態的陣列,例如 Integer 陣列,那麼這是一個物件參考的陣列,元素預設為 null。在使用這些元素之前,必須確保它們已被初始化,否則會導致 NullPointerException

使用包裝類型的陣列

public class ArrayClassObj {
  public static void main(String[] args) {
    Random rand = new Random(47);
    Integer[] a = new Integer[rand.nextInt(20)];
    System.out.println("length of a = " + a.length);
    for(int i = 0; i < a.length; i++)
      a[i] = rand.nextInt(500); // Autoboxing
    System.out.println(Arrays.toString(a));
  }
} /* Output: (Sample)
length of a = 18
[55, 193, 361, 461, 429, 368, 200, 22, 207, 288, 128, 51, 89, 309, 278, 498, 361, 20]
*/
  • 在這個範例中,使用了包裝類型 Integer,這是一個物件而非基本型態。
  • 即使使用 new 建立了陣列,仍然只是一個參考陣列,必須為每個元素創建新的 Integer 物件。
  • 如果忘記初始化元素而直接使用,會導致運行時錯誤。

初始化物件型態的陣列

在定義時,可以使用大括號 {} 來初始化物件型態的陣列,這包括直接使用 new Integer() 創建物件,或利用自動裝箱直接將基本型態賦值給包裝類型。

public class ArrayInit {
  public static void main(String[] args) {
    Integer[] a = {
      new Integer(1),
      new Integer(2),
      3, // Autoboxing
    };
    Integer[] b = new Integer[]{
      new Integer(1),
      new Integer(2),
      3, // Autoboxing
    };
    System.out.println(Arrays.toString(a));
    System.out.println(Arrays.toString(b));
  }
} /* Output:
[1, 2, 3]
[1, 2, 3]
*/
注意:列表中的最後一個逗號是可選的,這在初始化大量元素時特別方便。

使用陣列傳遞參數給方法

陣列可以作為方法的參數,允許在方法之間傳遞多個資料。這在需要動態創建並初始化陣列時特別有用,例如將字串陣列作為參數傳遞給其他方法。

public class DynamicArray {
  public static void main(String[] args) {
    Other.main(new String[]{ "fiddle", "de", "dum" });
  }
}

class Other {
  public static void main(String[] args) {
    for(String s : args)
      System.out.print(s + " ");
  }
} /* Output:
fiddle de dum
*/

在這個範例中,我們在 DynamicArraymain 方法中,動態建立了一個字串陣列並傳遞給 Other 類別的 main 方法。這展示了如何在方法調用時動態創建並初始化陣列。

結論

陣列是 Java 中一種強大且靈活的資料結構,理解其宣告、初始化和使用方式對於編寫高效的 Java 程式至關重要。無論是基本型態還是物件型態的陣列,都有其特定的初始化和使用方式。透過靈活地使用陣列,我們可以更有效地處理大量的資料,並將其傳遞給方法進行處理。