java.util.Arrays 是 JDK 提供的數組操作工具類,封裝了排序、查找、比較、填充、轉字符串、流式轉換等高頻操作,全部為 static 方法,開箱即用。本文系統梳理核心 API,配合實戰場景與性能提示,助你寫出更優雅、高效的數組代碼。
| 分類 | 代表方法 | 說明 | 備註 |
|---|---|---|---|
| 排序 | sort(T[]) | 原地升序排序(基本類型雙軸快排,對象 TimSort) | 穩定排序用 sort(T[], Comparator) |
parallelSort(T[]) | 並行排序(JDK 8+,ForkJoinPool 多線程) | 大數組(>1萬)顯著加速 | |
sort(T[], from, to) | 區間排序 [from, to) | 支援部分排序 | |
| 查找 | binarySearch(T[], key) | 二分查找,**前提:已排序** | 返回索引或 (-(插入點)-1) |
binarySearch(T[], from, to, key) | 區間二分查找 | ||
binarySearch(T[], key, Comparator) | 自定義比較器查找 | ||
| 比較 | equals(T[], T[]) | 長度相同且對應元素 equals 相等 | 基本類型重載比較值 |
deepEquals(Object[], Object[]) | 深度比較(遞歸進入嵌套數組) | 多維數組必用 | |
compare(T[], T[]) | 字典序比較(JDK 9+) | 返回負/零/正 | |
| 填充/複製 | fill(T[], val) | 全部元素賦值 val | 基本類型/對象引用同值 |
copyOf(T[], newLen) | 複製並調整長度(截斷/補默認值) | 擴容常用 | |
copyOfRange(T[], from, to) | 區間複製 [from, to) | 切片操作 | |
| 轉換/視圖 | toString(T[]) | 生成 [a, b, c] 格式字符串 | 調試神器 |
deepToString(Object[]) | 多維數組深度轉字符串 | ||
stream(T[]) | 轉為 Stream<T>(JDK 8+) | 接入 Stream API 鏈式操作 | |
| 其他 | setAll(T[], IntFunction) | 用生成器函數賦值(JDK 8+) | setAll(arr, i -> i*2) |
// 基本類型
int[] arr = new int[100];
Arrays.setAll(arr, i -> i * 2); // [0, 2, 4, ..., 198]
// 對象數組
String[] names = new String[5];
Arrays.fill(names, "Guest"); // 全部 "Guest"
int[] nums = {3, 1, 2, 3, 2, 4};
Arrays.sort(nums); // [1, 2, 2, 3, 3, 4]
int[] distinct = Arrays.stream(nums).distinct().toArray(); // [1, 2, 3, 4]
// 或手動雙指針去重(極致性能)
int[][] matrix1 = {{1,2}, {3,4}};
int[][] matrix2 = {{1,2}, {3,4}};
Arrays.equals(matrix1, matrix2); // false(比較行引用)
Arrays.deepEquals(matrix1, matrix2); // true(遞歸比較值)
System.out.println(Arrays.deepToString(matrix1)); // [[1, 2], [3, 4]]
int[] sorted = {10, 20, 30, 40};
int idx = Arrays.binarySearch(sorted, 25); // 返回 -3
int insertPos = -idx - 1; // = 2,應插入索引 2
// 結合 copyOfRange 實現有序插入
String[] words = {"apple", "banana", "pear"};
Arrays.stream(words)
.filter(s -> s.length() > 5)
.map(String::toUpperCase)
.forEach(System.out::println); // BANANA
asList(T...) 返回固定長度 List,不支援 add/remove,需 `new ArrayList<>(Arrays.asList(...))`Arrays.sort 非線程安全,共享數組需自行加鎖或用並行流
User[] users = {new User(3,"C"), new User(1,"A"), new User(2,"B")};
// 按 id 升序
Arrays.sort(users, Comparator.comparingInt(User::getId));
// 按 name 降序
Arrays.sort(users, Comparator.comparing(User::getName).reversed());
// 多鍵排序:先 id 升序,id 相同按 name 降序
Arrays.sort(users, Comparator
.comparingInt(User::getId)
.thenComparing(Comparator.comparing(User::getName).reversed()));
掌握 Arrays 這把「瑞士軍刀」,能讓你在處理數組時少寫大量樣板代碼,專注於業務邏輯。建議收藏本文速查表,下次寫到 for (int i=0; i<arr.length; i++) 時先想一想:Arrays 有沒有現成方法?