首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java Arrays 工具類完全指南:核心方法、性能陷阱與最佳實踐

     編輯:Java 綜合教學

Java Arrays 工具類完全指南:核心方法、性能陷阱與最佳實踐

java.util.Arrays 是 Java 集合框架的「瑞士軍刀」,提供了靜態方法操作**基本類型數組**與**對象數組**,涵蓋排序、查找、比較、填充、複製、轉字符串、轉 List、並行處理等高頻操作。掌握其 API 細節、底層算法選擇、邊界行為,能顯著提升數組處理代碼的質量與性能。

一、 核心方法分類速查表 (JDK 8+)

分類方法簇關鍵參數/返回說明
字符串表示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
轉 ListasList(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/正

二、 高頻陷阱與避坑指南

  1. asList() 返回的 List 不可結構性修改:
    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+ 不可變)
  2. 基本類型數組無法直接用 asList:
    int[] arr = {1,2,3};
    List list = Arrays.asList(arr); // List 長度 1,元素是 int[] 數組!
    // 正確:IntStream.of(arr).boxed().collect(Collectors.toList()) 或手寫循環/Guava Ints.asList
  3. fill() 對象數組是淺拷貝:
    Object[] arr = new Object[3];
    Arrays.fill(arr, new Date()); // 三個元素指向同一 Date 對象!
    arr[0] = new Date(); // 僅修改引用,不影響其他
  4. binarySearch() 前提是有序: 無序數組調用結果**不可預期** (不拋異常,返回負值誤導)。
  5. sort() 原地修改: 無副本,調用後原數組已排序。需保留原序請先 copyOf。
  6. parallelSort() 閾值: 默認數組長度 < 8192 退化為串行排序,小數組並行反而更慢。
  7. 多維數組複製是淺層: 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 略快)循環賦值

四、 進階:Arrays vs Collections vs Stream API 選型


// 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 進行函數式處理,構建現代、高效、可讀的數組操作代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved