java.util.Arrays 是 Java 集合框架的「瑞士軍刀」,提供了靜態方法操作**基本類型數組**與**對象數組**,涵蓋排序、查找、比較、填充、複製、轉字符串、轉 List、並行處理等高頻操作。掌握其 API 細節、底層算法選擇、邊界行為,能顯著提升數組處理代碼的質量與性能。
| 分類 | 方法簇 | 關鍵參數/返回 | 說明 |
|---|---|---|---|
| 字符串表示 | toString(type[]) | 返回 String | 「[a, b, c]」格式,避免手寫循環打印,null 數組返回 "null" |
deepToString(Object[]) | 返回 String | 遞歸處理嵌套/多維數組,防止無限遞歸 (標記已訪問) | |
| 排序 | sort(type[]) / sort(type[], from, to) | void (原地排序) | 基本類型:雙軸快排 (JDK 7+);對象:TimSort (歸併排序變體),穩定、O(n log n) |
parallelSort(type[]) | void | 並行排序 (ForkJoinPool),大數組 (>8192) 顯著加速,小數組開銷大 | |
sort(T[], Comparator) | void | 自定義比較器排序,null 排在最前 (自然順序) | |
| 二分查找 | binarySearch(type[], key) | 返回 int 索引 | 前提:數組已按升序排序。找到返回索引 (非唯一時任意);未找到返回 -(插入點) - 1 (負值) |
binarySearch(T[], key, Comparator) | 返回 int | 自定義比較器查找,同樣要求按比較器順序排序 | |
| 填充 | fill(type[], val) / fill(type[], from, to, val) | void | 賦值同一值,**基本類型高效**;對象數組填充**同一引用** (淺拷貝),修改一處影響所有 |
| 複製/縮擴 | copyOf(type[], newLength) | 返回新數組 | 截斷或擴展 (基本類型補 0/false/null),**常用於動態數組擴容** |
copyOfRange(type[], from, to) | 返回新數組 | 複製 [from, to) 區間,**左閉右開**,from 可為負 (補默認值) | |
copyOfRange(..., newType[]) | 返回新數組 | 類型轉換複製 (如 Object[] → String[]),運行期檢查類型兼容 | |
| 比較 | equals(type[], type[]) / deepEquals(Object[], Object[]) | 返回 boolean | 逐元素比較 (基本類型值比較,對象調用 equals);deepEquals 遞歸比較嵌套數組 |
| 雜湊碼 | hashCode(type[]) / deepHashCode(Object[]) | 返回 int | 基於內容計算哈希,**內容相同則哈希相同**,配合 equals 用於集合 Key |
| 轉 List | asList(T... a) | 返回 List | 固定大小、底層共享原數組,**不可增刪** (拋 UnsupportedOperationException),修改元素影響原數組 |
| 並行/流式 (JDK 8+) | parallelPrefix(type[], Op) | void | 並行前綴計算 (如累加、乘積),利用 ForkJoinPool,大數組加速 |
spliterator(type[]) | 返回 Spliterator | 支持並行流 Arrays.stream(arr).parallel() | |
stream(type[]) / stream(type[], from, to) | 返回 Stream | 數組轉流,支持函數式操作鏈 | |
| 不匹配索引 (JDK 9+) | mismatch(type[], type[]) | 返回 int | 返回首個不匹配索引,完全匹配返回 -1,比手寫循環更優化 |
| 比較器 (JDK 9+) | compare(type[], type[]) / compareUnsigned | 返回 int | 字典序比較 (類似 String.compareTo),返回負/0/正 |
List list = Arrays.asList("a", "b");
list.add("c"); // 拋 UnsupportedOperationException
list.set(0, "x"); // OK,修改元素,原數組同步變化
// 需可變 List:new ArrayList<>(Arrays.asList(...)) 或 List.of("a","b") (JDK 9+ 不可變)
int[] arr = {1,2,3};
List list = Arrays.asList(arr); // List 長度 1,元素是 int[] 數組!
// 正確:IntStream.of(arr).boxed().collect(Collectors.toList()) 或手寫循環/Guava Ints.asList
Object[] arr = new Object[3];
Arrays.fill(arr, new Date()); // 三個元素指向同一 Date 對象!
arr[0] = new Date(); // 僅修改引用,不影響其他
copyOf。copyOf 複製引用,修改子數組元素會影響原數組。深拷貝需逐層 copyOf 或序列化/流式複製。| 場景 | 推薦方案 | 避免方案 |
|---|---|---|
| 大數組排序 (基本類型) | Arrays.parallelSort() (JDK 8+) | 手寫快排/單線程 sort |
| 大數組排序 (對象) | Arrays.parallelSort(arr, comparator) | 串行 sort |
| 頻繁擴容動態數組 | ArrayList (內部用 Arrays.copyOf 1.5 倍擴容) | 手寫 copyOf 每次 +1 |
| 數組轉流並行處理 | Arrays.stream(arr).parallel()... | 手寫線程分割 |
| 基本類型數組求和/聚合 | Arrays.stream(arr).sum() / IntStream.of(arr).sum() | 手寫 for 循環 (JIT 優化同等,流更簡潔) |
| 高性能數組複製 | System.arraycopy (JVM 內部優化,比 Arrays.copyOf 略快) | 循環賦值 |
// 1. 固定大小數組操作 → Arrays
int[] scores = {90, 85, 95};
Arrays.sort(scores);
int idx = Arrays.binarySearch(scores, 90);
String str = Arrays.toString(scores);
// 2. 可變集合操作 → Collections / List 實例方法
List list = new ArrayList<>(Arrays.asList(90, 85, 95));
Collections.sort(list); // 或 list.sort(null)
list.add(100);
// 3. 函數式鏈式處理、並行、過濾映射歸約 → Stream API
int max = Arrays.stream(scores).max().orElse(0);
long count = Arrays.stream(scores).filter(s -> s > 90).count();
double avg = Arrays.stream(scores).average().orElse(0);
// 4. 基本類型專用流避免裝箱
int sum = IntStream.of(scores).sum(); // 無 Integer 裝箱開銷
Arrays 是數組操作的**標準庫首選**,核心優勢在於:算法優化 (雙軸快排/TimSort/並行排序)、API 完整覆蓋基本類型與對象、零依賴、JIT 深度優化。關鍵記住:asList 固定大小共享數組、fill 對象淺拷貝、binarySearch 需有序、parallelSort 大數組才有效。結合 Stream API 進行函數式處理,構建現代、高效、可讀的數組操作代碼。