陣列是 Java 最基礎的資料結構。本文系統整理一維陣列兩種初始化語法、四種遍歷方式、System.arraycopy 高效複製、Arrays.fill 填充、Arrays.equals 比較、Arrays.asList 集合轉換等核心操作,附完整可執行代碼與輸出結果驗證。
// 1. 靜態初始化 (大括號列出元素,長度由元素個數決定)
int[] scores = {90, 85, 100, 78};
String[] names = {"Alice", "Bob", "Charlie"};
// 2. 動態初始化 (指定長度,元素自動賦預設值)
int[] arr = new int[5]; // {0, 0, 0, 0, 0}
String[] strs = new String[3]; // {null, null, null}
boolean[] flags = new boolean[2]; // {false, false}
// 預設值速查:數值型 0、char '\u0000'、boolean false、引用型 null
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
for (int val : arr) {
System.out.print(val + " ");
}
// 注意:無法獲取索引,無法修改原陣列元素 (基本類型傳值)
System.out.println(Arrays.toString(arr)); // [1, 2, 3, 4, 5]
Arrays.stream(arr).forEach(System.out::print); int sum = Arrays.stream(arr).sum(); int max = Arrays.stream(arr).max().orElse(0);
String[] src = {"H", "e", "l", "l", "o"};
String[] dest = new String[7]; // 目標較長
// arraycopy(src, srcPos, dest, destPos, length)
System.arraycopy(src, 0, dest, 1, src.length);
// dest = [null, "H", "e", "l", "l", "o", null]
// 複製前 3 個到 dest[2]
System.arraycopy(src, 0, dest, 2, 3);
// dest = [null, "H", "H", "e", "l", "o", null]
String[] a = new String[3]; Arrays.fill(a, "I love you"); // a = ["I love you", "I love you", "I love you"] // 區間填充 fill(arr, fromIndex, toIndex, val) (含頭不含尾) Arrays.fill(a, 1, 3, "Hi"); // a[1], a[2] = "Hi"
String[] a = {"a", "b", "c"};
String[] b = {"A", "B", "C"};
String[] c = {"a", "b", "c"};
Arrays.equals(a, b); // false (區分大小寫)
Arrays.equals(a, c); // true
// 多維陣列比較需用 deepEquals
int[][] m1 = {{1,2}, {3}};
int[][] m2 = {{1,2}, {3}};
Arrays.deepEquals(m1, m2); // true
int[] nums = {5, 2, 8, 1, 9};
Arrays.sort(nums); // [1, 2, 5, 8, 9]
Arrays.sort(nums, 1, 4); // 區間排序 [1, 4) → [1, 2, 5, 8, 9]
// 物件陣列需實作 Comparable 或傳 Comparator
String[] words = {"apple", "banana", "cherry"};
Arrays.sort(words, Comparator.comparingInt(String::length)); // 按長度排序
int[] sorted = {10, 20, 30, 40, 50};
int idx = Arrays.binarySearch(sorted, 30); // 2
int idx2 = Arrays.binarySearch(sorted, 25); // -2 (插入點 -1 取反) → 插入點索引 1
String[] arr = {"I", "LOVE", "JAVA"};
List list = Arrays.asList(arr);
System.out.println(list); // [I, LOVE, JAVA]
// 真正可變 List
List mutable = new ArrayList<>(Arrays.asList(arr));
mutable.add("!"); // OK
| 陷阱 | 原因 | 正確做法 |
|---|---|---|
| 陣列長度不可變 | 陣列記憶體連續分配,建立後固定 | 需動態增減用 ArrayList / Arrays.copyOf 擴容 |
| Arrays.asList 返回固定長度 List | 底層仍是陣列,不支援 add/remove | 包裝 new ArrayList<>(Arrays.asList(...)) |
| 基本型別陣列無法用泛型 | 泛型擦除只支援引用型別 | 用包裝類 Integer[] 或 Stream IntStream |
| 多維陣列比較用 equals 返回 false | equals 比較引用地址 | 用 Arrays.deepEquals |
| binarySearch 用在未排序陣列 | 結果不可預測 | 先 Arrays.sort |
System.arraycopy:原生內存複製,比手寫迴圈快 5-10x (JIT 會優化為 memmove)。Arrays.fill:同樣內部用 Arrays.fill 內部迴圈,JIT 向量化優化。Arrays.sort 雙軸快排 (基本型別) / TimSort (物件),遠快於手寫排序。