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

Java 開發必會的 Arrays 工具類 15 大核心方法實戰指南

     編輯:Java 相關知識

java.util.Arrays 是日常開發高頻工具類,掌握其核心方法能大幅減少樣板代碼。本文以實戰為導向,通過完整測試用例講解 asList、排序、查找、複製、比較、填充、轉流、並行前綴/設置等 15 大方法,並揭示避坑要點。

一、測試基礎數據


public class ArraysTest {
    String[] strArr = {"a", "c", "2", "1", "b"};
    Integer[] intArr = {5, 1, 4, 3, 2};
    // 所有測試基於以上數據
}

二、核心方法詳細講解

1. asList(T... a) — 數組轉 List


List list = Arrays.asList(strArr); // [a, c, 2, 1, b]
// 注意:返回固定長度 List,不支持 add/remove,底層數組共享
// 修改 list 元素會影響原數組,反之亦然
需可變 List 請用 new ArrayList<>(Arrays.asList(arr))。

2. 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()); // 降序

3. binarySearch — 二分查找(前提:已排序)


Arrays.sort(strArr);
int idx = Arrays.binarySearch(strArr, "c"); // 返回索引 4
// 未找到返回 (-(插入點) - 1),插入點 = 保持有序應插入的索引

4. 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]

5. 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

6. equals — 一維數組內容比較


String[] arr2 = {"a", "c", "2", "1", "b"};
Arrays.equals(strArr, arr2); // true(逐元素 equals 比較)
// 流程:引用相同→true | 任一 null→false | 長度不同→false | 逐元素比較

7. fill — 統一填充


Arrays.fill(strArr, "test"); // [test, test, test, test, test]
Arrays.fill(strArr, 1, 4, "x"); // 區間填充 [a, x, x, x, b]

8. toString / deepToString — 格式化輸出


Arrays.toString(strArr);    // [a, c, 2, 1, b]
Arrays.deepToString(matrix); // [[a, b], [c]] (多維必須用 deep)

9. stream / parallelStream — 轉 Stream (Java 8+)


Arrays.stream(strArr).forEach(System.out::println);
// 等價於 Stream.of(strArr) 但避免裝箱開銷(基本類型數組有專用 IntStream 等)

10. parallelPrefix — 並行前綴累積


// 原數組 [5,1,4,3,2] → 累加 [5, 6, 10, 13, 15]
Arrays.parallelPrefix(intArr, (x, y) -> x + y);

11. 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]

12. mismatch (Java 9+) — 首個不匹配索引


int[] a = {1,2,3}, b = {1,2,4};
Arrays.mismatch(a, b); // 返回 2 (索引 2 處 3!=4)

13. 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 QuickSortO(n log n) 平均不穩定基本類型、通用場景
parallelSort並行合併排序O(n log n) / 核心數不穩定大數組、多核 CPU

四、避坑清單

  1. asList 返回固定長度 List,調用 add/remove 拋 UnsupportedOperationException。
  2. binarySearch 前提必須已排序,否則結果不可預期。
  3. 基本類型數組無 deepEquals/deepToString,僅適用引用類型/多維數組。
  4. parallelSort 小數組(<8192 元素)會退化為串行排序。
  5. setAll/parallelSetAll 生成器函數不可為 null,且索引從 0 開始。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved