| 特性 | 陣列 | 集合 |
|---|---|---|
| 元素類型 | 基本型別 + 參考型別 | 僅參考型別 (自動裝箱/拆箱) |
| 長度 | 固定 | 動態擴縮 |
| API 豐富度 | 低 (需自行實作/Arrays 工具) | 高 (CRUD、排序、篩選、流式處理) |
| 泛型支援 | 無 (共變風險) | 完整泛型 |
int[] scores = {37, 47, 23, -5, 19, 56};
Arrays.sort(scores); // 原地排序,升序
// 輸出:-5, 19, 23, 37, 47, 56
int[] sorted = {-5, 19, 23, 37, 47, 56};
int idx = Arrays.binarySearch(sorted, 35); // 回傳 -4 (負數 = 未找到)
int insertPos = -(idx + 1); // = 3,即應插入索引 3
回傳值規則:-(插入點) - 1。插入點 = 為維持有序應插入的索引。
Arrays.toString(arr) / deepToString:除錯輸出Arrays.copyOf(arr, newLen)、copyOfRange:擴縮陣列Arrays.equals(a1, a2)、deepEquals:內容比較Arrays.fill(arr, val):填充Arrays.stream(arr):轉 Stream 進行函數式處理public static Object[] toObjectArray(int[] primitive) {
if (primitive == null) return null;
Integer[] boxed = new Integer[primitive.length];
for (int i = 0; i < primitive.length; i++) {
boxed[i] = primitive[i]; // 自動裝箱
}
return boxed;
}
int[] primitive = {1, 2, 3};
Integer[] boxed = Arrays.stream(primitive).boxed().toArray(Integer[]::new);
List list = Arrays.stream(primitive).boxed().collect(Collectors.toList());
String[] arr = {"A", "B", "C"};
// 1. Arrays.asList (固定長度,底層共用陣列)
List fixedList = Arrays.asList(arr);
// 2. 新建可變 List
List mutableList = new ArrayList<>(Arrays.asList(arr));
// 3. Stream (靈活篩選/轉換)
List filtered = Arrays.stream(arr).filter(s -> s.compareTo("B") > 0).collect(Collectors.toList());
陷阱:Arrays.asList 回傳固定長度清單,呼叫 add/remove 會丟 UnsupportedOperationException。
List list = List.of("A", "B", "C");
// 1. toArray(new String[0]) (JVM 最佳化,推薦)
String[] arr1 = list.toArray(new String[0]);
// 2. toArray(String[]::new) (Java 11+)
String[] arr2 = list.toArray(String[]::new);
Object[] data = {Integer.valueOf(37), Integer.valueOf(47)};
List
適用場景:唯讀遍歷、零拷貝橋接舊 API。需修改長度時請 new ArrayList<>(view)。
| 操作 | 時間複雜度 | 記憶體 | 建議 |
|---|---|---|---|
| 基本型別陣列排序 | O(n log n) | 原地 | 首選 |
| 基本型別 → 物件陣列 | O(n) | 新增 O(n) 物件 | 必要時才轉,避免頻繁裝箱 |
| List ⇄ 陣列轉換 | O(n) | 新陣列/清單 | 邊界層轉換,核心邏輯統一用 List/Stream |
| Arrays.asList 視圖 | O(1) | 無額外 | 高頻唯讀存取首選 |
List<T> / Set<T> / Stream<T>,享受泛型與豐富 API。byte[]。boxed()/toArray()。Arrays.stream、Collection.stream 進行無副作用資料流處理。陣列是 JVM 底層高效資料結構,集合是開發者友善的抽象。掌握 Arrays、Collections、Stream 三大工具箱的轉換慣用語,才能在效能與生產力之間遊刃有餘。