Object,實作 Cloneable、Serializable。// 宣告(兩種風格皆可,推薦第二種)
int[] scores;
int scores[]; // C 風格,不推薦
// 建立並指定長度
scores = new int[5]; // 預設值 0
// 宣告+建立合寫
int[] scores = new int[5];
int[] primes = {2, 3, 5, 7, 11}; // 長度自動推導為 5
String[] names = {"Alice", "Bob", "Charlie"};
System.out.println(primes[0]); // 2
System.out.println(primes.length); // 5 (屬性,非方法)
// 索引範圍 0 ~ length-1,越界拋 ArrayIndexOutOfBoundsException
// 傳統 for
for (int i = 0; i < arr.length; i++) { ... }
// 增強 for (Java 5+),唯讀遍歷
for (int v : arr) { ... }
// Java 8 Stream
Arrays.stream(arr).forEach(System.out::println);
int[][] matrix = new int[3][4]; // 3 列,每列 4 欄
// 記憶體佈局:matrix 指向長度 3 的陣列,每個元素指向長度 4 的 int 陣列
int[][] ragged = new int[3][];
ragged[0] = new int[2];
ragged[1] = new int[5];
ragged[2] = new int[3]; // 每列長度不同
int[][] board = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
for (int[] row : matrix) {
for (int cell : row) { ... }
}
| 方法 | 功能 |
|---|---|
Arrays.toString(arr) | 一維陣列轉可讀字串 [1, 2, 3] |
Arrays.deepToString(arr) | 多維陣列遞迴轉字串 |
Arrays.sort(arr) | 原地排序 (Dual-Pivot Quicksort) |
Arrays.binarySearch(arr, key) | 二分搜尋 (前提已排序) |
Arrays.copyOf(arr, newLen) | 複製並調整長度 |
Arrays.fill(arr, val) | 填充指定值 |
Arrays.equals(a, b) | 內容逐項比較 |
Arrays.stream(arr) | 轉 Stream 進行函式式操作 |
int[] a = {1,2,3};
int[] b = a; // 參考複製,指向同一物件
int[] c = a.clone(); // 淺層複製,基本型別值複製
int[] d = Arrays.copyOf(a, a.length); // 同 clone()
b[0] = 99;
System.out.println(a[0]); // 99 (a,b 共享)
System.out.println(c[0]); // 1 (獨立)
多維陣列 clone() 僅淺層複製第一層,內層陣列仍共享,需手動深層複製。
| 特性 | 陣列 | ArrayList |
|---|---|---|
| 長度 | 固定 | 動態擴容 |
| 型別 | 基本型別/物件 | 僅物件 (自動裝箱) |
| 效能 | 極高 (連續記憶體) | 略低 (擴容複製) |
| API 豐富度 | 低 | 高 (增刪改查、流) |
建議:已知固定長度、高效能、基本型別 → 陣列;其餘 → ArrayList。
int[] a = new int[3]; 元素預設值? → 0String[] s = new String[3]; 預設值? → null== 比較內容? → 不能,比較參考;用 Arrays.equals()。Collections.reverse(Arrays.asList(arr)) 或雙指標交換。