Thinking in Java(4-5) 陣列宣告與初始化
在 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
*/
在這個範例中,我們在 DynamicArray
的 main
方法中,動態建立了一個字串陣列並傳遞給 Other
類別的 main
方法。這展示了如何在方法調用時動態創建並初始化陣列。
結論
陣列是 Java 中一種強大且靈活的資料結構,理解其宣告、初始化和使用方式對於編寫高效的 Java 程式至關重要。無論是基本型態還是物件型態的陣列,都有其特定的初始化和使用方式。透過靈活地使用陣列,我們可以更有效地處理大量的資料,並將其傳遞給方法進行處理。
Comments ()