java.util.Arrays 是 JDK 提供的數組操作「瑞士軍刀」,封裝了排序、查找、比較、填充、轉字符串、流式轉換等高頻操作。本文系統梳理核心靜態方法、重載規律、性能特性、Java 8+ 並行增強、常見陷阱,並給出生產級代碼示例。
| 分類 | 代表方法 | 說明 |
|---|---|---|
| 轉字符串 | toString(type[]) | 一維數組 → "[a, b, c]" |
deepToString(Object[]) | 多維/嵌套數組遞歸轉字符串 | |
toString(int[], int, int) | Java 9+ 截取範圍轉字符串 | |
| 排序 | sort(type[]) | 雙軸快排(基本類型)/ TimSort(對象),原地排序 |
sort(type[], from, to) | 區間排序 | |
parallelSort(type[]) | Java 8+ 并行排序,大數據量顯著加速 | |
parallelPrefix(type[], Op) | 并行前綴累積 | |
| 查找 | binarySearch(type[], key) | 前提:數組已按升序排序,返回索引或 (-(插入點)-1) |
binarySearch(type[], from, to, key) | 區間查找 | |
binarySearch(T[], key, Comparator) | 自定義比較器 | |
| 填充/賦值 | fill(type[], val) | 全部元素設置為 val |
fill(type[], from, to, val) | 區間填充 | |
setAll(type[], IntFunction) | Java 8+ 函數式生成元素 | |
| 比較 | equals(type[], type[]) | 長度相同且對應元素 equals 相等 |
deepEquals(Object[], Object[]) | 遞歸比較多維數組 | |
compare(type[], type[]) | Java 9+ 字典序比較,返回 -1/0/1 | |
| 複製/縮放 | copyOf(type[], newLen) | 截取/擴展,不足補默認值 |
copyOfRange(type[], from, to) | 區間複製 [from, to) | |
copyOf(type[], newLen, Class) | 類型轉換複製 | |
| 流式轉換 | stream(type[]) | Java 8+ 返回 IntStream/Stream |
| 雜項 | hashCode(type[]), mismatch(type[], type[]) | Java 9+ 返回首個不匹配索引 |
import java.util.Arrays;
public class ArraysBasics {
public static void main(String[] args) {
int[] arr = {3, 44, 2, 546, 74};
// 轉字符串
System.out.println("原始: " + Arrays.toString(arr));
// [3, 44, 2, 546, 74]
// 排序(原地修改)
Arrays.sort(arr);
System.out.println("排序後: " + Arrays.toString(arr));
// [2, 3, 44, 74, 546]
// 二分查找(前提:已排序)
int idx = Arrays.binarySearch(arr, 44);
System.out.println("44 的索引: " + idx); // 2
int notFound = Arrays.binarySearch(arr, 5);
System.out.println("5 的插入點: " + notFound); // -3 → 插入點 = -(-3)-1 = 2
}
}
int[][] matrix = {{1,2}, {3,4,5}, {6}};
System.out.println("toString: " + Arrays.toString(matrix));
// [[I@15db9742, [I@6d06d69c, [I@7852e922] ← 無意義哈希碼
System.out.println("deepToString: " + Arrays.deepToString(matrix));
// [[1, 2], [3, 4, 5], [6]] ← 遞歸展開
import java.util.Arrays;
import java.util.Random;
public class ParallelSortDemo {
public static void main(String[] args) {
int size = 10_000_000;
int[] data1 = new Random().ints(size).toArray();
int[] data2 = Arrays.copyOf(data1, size);
long t1 = System.currentTimeMillis();
Arrays.sort(data1);
System.out.println("串行排序耗時: " + (System.currentTimeMillis() - t1) + " ms");
long t2 = System.currentTimeMillis();
Arrays.parallelSort(data2);
System.out.println("並行排序耗時: " + (System.currentTimeMillis() - t2) + " ms");
// 典型輸出:串行 ~1200ms,並行 ~300ms(8核機器)
}
}
適用閾值:JDK 內部邏輯,數組長度 < 8192 自動退回串行;大數據量並行優勢明顯。
// 生成 0..9
int[] seq = new int[10];
Arrays.setAll(seq, i -> i);
System.out.println(Arrays.toString(seq)); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
// 生成斐波那契數列前 15 項
int[] fib = new int[15];
Arrays.setAll(fib, i -> i < 2 ? i : fib[i-1] + fib[i-2]);
System.out.println(Arrays.toString(fib));
// [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
int[] nums = {3, 1, 4, 1, 5, 9, 2, 6};
int sum = Arrays.stream(nums)
.filter(n -> n % 2 == 1)
.map(n -> n * n)
.sum();
System.out.println("奇數平方和: " + sum); // 1^2+1^2+5^2+9^2 = 108
String[] fruits = {"banana", "apple", "pear", "orange"};
// 自然順序
Arrays.sort(fruits);
System.out.println(Arrays.toString(fruits));
// [apple, banana, orange, pear]
// 按長度降序
Arrays.sort(fruits, (a, b) -> Integer.compare(b.length(), a.length()));
System.out.println(Arrays.toString(fruits));
// [banana, orange, apple, pear]
// 二分查找需同比較器
int idx = Arrays.binarySearch(fruits, "apple", (a, b) -> Integer.compare(b.length(), a.length()));
System.out.println("apple 索引: " + idx);
int[] → IntStream,Integer[] → Stream<Integer>。copyOf。ClassCastException。fill(objArr, obj) 所有位置指向同一對象,修改一處影響全體。equals 視 NaN == NaN 為 true,0.0 == -0.0 為 true,符合 IEEE 754 但與 == 行為不同。| 方法 | 示例 | 用途 |
|---|---|---|
mismatch(arr1, arr2) | int i = Arrays.mismatch(a, b); | 返回首個不同索引,相同返回 -1 |
compare(arr1, arr2) | int c = Arrays.compare(a, b); | 字典序比較,可用於排序 |
toString(arr, from, to) | Arrays.toString(arr, 2, 5) | 截取範圍輸出,避免複製 |
equals(arr1, arr2, from, to) | Arrays.equals(a, b, 0, 3) | 區間比較 |
Arrays 是數組操作的「標準庫」,掌握 toString/sort/binarySearch/fill/setAll/stream/copyOf 這幾大核心方法族,覆蓋 95% 日常場景。關鍵記住:
配合 Java 8+ Stream API 與 Java 9+ mismatch/compare,Arrays 仍是高性能數據處理的基石工具。