java.util.Arrays 是日常開發高頻工具類,掌握其核心方法能大幅減少樣板代碼。本文以實戰為導向,通過完整測試用例講解 asList、排序、查找、複製、比較、填充、轉流、並行前綴/設置等 15 大方法,並揭示避坑要點。
public class ArraysTest {
String[] strArr = {"a", "c", "2", "1", "b"};
Integer[] intArr = {5, 1, 4, 3, 2};
// 所有測試基於以上數據
}
asList(T... a) — 數組轉 List
List list = Arrays.asList(strArr); // [a, c, 2, 1, b]
// 注意:返回固定長度 List,不支持 add/remove,底層數組共享
// 修改 list 元素會影響原數組,反之亦然
需可變 List 請用 new ArrayList<>(Arrays.asList(arr))。
sort / parallelSort — 排序
Arrays.sort(strArr); // 自然順序:[1, 2, a, b, c]
Arrays.sort(strArr, 2, 5); // 區間排序 [2,5):[a, c, 1, 2, b]
Arrays.parallelSort(intArr); // 並行排序(大數據量顯著提速)
// 自定義比較器
Arrays.sort(strArr, Comparator.reverseOrder()); // 降序
binarySearch — 二分查找(前提:已排序)
Arrays.sort(strArr);
int idx = Arrays.binarySearch(strArr, "c"); // 返回索引 4
// 未找到返回 (-(插入點) - 1),插入點 = 保持有序應插入的索引
copyOf / copyOfRange — 複製數組
Integer[] copy1 = Arrays.copyOf(intArr, 10); // 長度不足補默認值(0) → [5,1,4,3,2,0,0,0,0,0]
Integer[] copy2 = Arrays.copyOf(intArr, 3); // 截取前 3 位 → [5,1,4]
Integer[] copy3 = Arrays.copyOfRange(intArr, 2, 4); // 區間 [2,4) → [4,3]
deepEquals / deepHashCode / deepToString — 多維/嵌套數組
String[][] matrix = {{"a","b"},{"c"}};
System.out.println(Arrays.deepToString(matrix)); // [[a, b], [c]]
System.out.println(Arrays.deepEquals(matrix, matrix)); // true
System.out.println(Arrays.deepHashCode(matrix)); // 基於內容計算 hash
equals — 一維數組內容比較
String[] arr2 = {"a", "c", "2", "1", "b"};
Arrays.equals(strArr, arr2); // true(逐元素 equals 比較)
// 流程:引用相同→true | 任一 null→false | 長度不同→false | 逐元素比較
fill — 統一填充
Arrays.fill(strArr, "test"); // [test, test, test, test, test]
Arrays.fill(strArr, 1, 4, "x"); // 區間填充 [a, x, x, x, b]
toString / deepToString — 格式化輸出
Arrays.toString(strArr); // [a, c, 2, 1, b]
Arrays.deepToString(matrix); // [[a, b], [c]] (多維必須用 deep)
stream / parallelStream — 轉 Stream (Java 8+)
Arrays.stream(strArr).forEach(System.out::println);
// 等價於 Stream.of(strArr) 但避免裝箱開銷(基本類型數組有專用 IntStream 等)
parallelPrefix — 並行前綴累積
// 原數組 [5,1,4,3,2] → 累加 [5, 6, 10, 13, 15]
Arrays.parallelPrefix(intArr, (x, y) -> x + y);
parallelSetAll / setAll — 並行/串行生成器填充
Integer[] arr = new Integer[5];
Arrays.parallelSetAll(arr, i -> i * i); // [0, 1, 4, 9, 16]
Arrays.setAll(arr, i -> i * 2); // [0, 2, 4, 6, 8]
mismatch (Java 9+) — 首個不匹配索引
int[] a = {1,2,3}, b = {1,2,4};
Arrays.mismatch(a, b); // 返回 2 (索引 2 處 3!=4)
compare / compareUnsigned (Java 9+) — 數組字典序比較
Arrays.compare(new int[]{1,2}, new int[]{1,3}); // -1 (第一個較小)
| 方法 | 算法 | 時間複雜度 | 穩定性 | 適用場景 |
|---|---|---|---|---|
sort(Object[]) | TimSort (合併+插入) | O(n log n) | 穩定 | 引用類型、部分有序數據極快 |
sort(primitive[]) | Dual-Pivot QuickSort | O(n log n) 平均 | 不穩定 | 基本類型、通用場景 |
parallelSort | 並行合併排序 | O(n log n) / 核心數 | 不穩定 | 大數組、多核 CPU |
asList 返回固定長度 List,調用 add/remove 拋 UnsupportedOperationException。binarySearch 前提必須已排序,否則結果不可預期。deepEquals/deepToString,僅適用引用類型/多維數組。parallelSort 小數組(<8192 元素)會退化為串行排序。setAll/parallelSetAll 生成器函數不可為 null,且索引從 0 開始。