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

Java Arrays 工具類全解析:排序、查找、轉字符串、填充、比較與並行操作

     編輯:Java 相關知識

前言

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+ 返回首個不匹配索引

實戰代碼示例

1. 基礎操作:toString、sort、binarySearch

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
    }
}

2. 多維數組與 deepToString

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]]  ← 遞歸展開

3. 並行排序性能對比(百萬級數據)

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 自動退回串行;大數據量並行優勢明顯。

4. 函數式生成與填充

// 生成 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]

5. 流式操作鏈

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

6. 對象數組排序與自定義比較器

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);

常見陷阱與最佳實踐

  1. binarySearch 前提必須已排序:未排序數組調用結果不可預測,不拋異常。
  2. 基本類型數組無法直接用 Stream:int[] → IntStream,Integer[] → Stream<Integer>。
  3. sort 會修改原數組:需保留原序請先 copyOf。
  4. 對象數組排序需實現 Comparable 或提供 Comparator,否則拋 ClassCastException。
  5. parallelSort 臨時空間佔用大:內存受限環境慎用,或分批處理。
  6. 填充引用類型數組:fill(objArr, obj) 所有位置指向同一對象,修改一處影響全體。
  7. 比較浮點數組:equals 視 NaN == NaN 為 true,0.0 == -0.0 為 true,符合 IEEE 754 但與 == 行為不同。

Java 9+ 新增實用方法

方法示例用途
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% 日常場景。關鍵記住:

  • 排序修改原數組、查找要求有序
  • 大數據量用 parallelSort、函數式生成用 setAll
  • 多維數組用 deepToString/deepEquals
  • 基本類型流用 IntStream/LongStream/DoubleStream

配合 Java 8+ Stream API 與 Java 9+ mismatch/compare,Arrays 仍是高性能數據處理的基石工具。

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