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

Java Arrays 工具類核心方法速查與實戰指南

     編輯:Java 綜合教學

Arrays 工具類:Java 數組操作的「瑞士軍刀」

java.util.Arrays 是 JDK 提供的數組操作工具類,封裝了排序、查找、比較、填充、轉字符串、流式轉換等高頻操作,全部為 static 方法,開箱即用。本文系統梳理核心 API,配合實戰場景與性能提示,助你寫出更優雅、高效的數組代碼。

核心方法分類速查表

分類代表方法說明備註
排序sort(T[])原地升序排序(基本類型雙軸快排,對象 TimSort)穩定排序用 sort(T[], Comparator)
parallelSort(T[])並行排序(JDK 8+,ForkJoinPool 多線程)大數組(>1萬)顯著加速
sort(T[], from, to)區間排序 [from, to)支援部分排序
查找binarySearch(T[], key)二分查找,**前提:已排序**返回索引或 (-(插入點)-1)
binarySearch(T[], from, to, key)區間二分查找
binarySearch(T[], key, Comparator)自定義比較器查找
比較equals(T[], T[])長度相同且對應元素 equals 相等基本類型重載比較值
deepEquals(Object[], Object[])深度比較(遞歸進入嵌套數組)多維數組必用
compare(T[], T[])字典序比較(JDK 9+)返回負/零/正
填充/複製fill(T[], val)全部元素賦值 val基本類型/對象引用同值
copyOf(T[], newLen)複製並調整長度(截斷/補默認值)擴容常用
copyOfRange(T[], from, to)區間複製 [from, to)切片操作
轉換/視圖toString(T[])生成 [a, b, c] 格式字符串調試神器
deepToString(Object[])多維數組深度轉字符串
stream(T[])轉為 Stream<T>(JDK 8+)接入 Stream API 鏈式操作
其他setAll(T[], IntFunction)用生成器函數賦值(JDK 8+)setAll(arr, i -> i*2)

實戰高頻場景

1. 快速初始化數組


// 基本類型
int[] arr = new int[100];
Arrays.setAll(arr, i -> i * 2);  // [0, 2, 4, ..., 198]

// 對象數組
String[] names = new String[5];
Arrays.fill(names, "Guest");     // 全部 "Guest"

2. 高效去重(配合排序)


int[] nums = {3, 1, 2, 3, 2, 4};
Arrays.sort(nums);                    // [1, 2, 2, 3, 3, 4]
int[] distinct = Arrays.stream(nums).distinct().toArray(); // [1, 2, 3, 4]
// 或手動雙指針去重(極致性能)

3. 多維數組深度比較與打印


int[][] matrix1 = {{1,2}, {3,4}};
int[][] matrix2 = {{1,2}, {3,4}};
Arrays.equals(matrix1, matrix2);        // false(比較行引用)
Arrays.deepEquals(matrix1, matrix2);    // true(遞歸比較值)
System.out.println(Arrays.deepToString(matrix1)); // [[1, 2], [3, 4]]

4. 二分查找插入點技巧


int[] sorted = {10, 20, 30, 40};
int idx = Arrays.binarySearch(sorted, 25); // 返回 -3
int insertPos = -idx - 1;                  // = 2,應插入索引 2
// 結合 copyOfRange 實現有序插入

5. 數組轉 Stream 玩轉函數式


String[] words = {"apple", "banana", "pear"};
Arrays.stream(words)
    .filter(s -> s.length() > 5)
    .map(String::toUpperCase)
    .forEach(System.out::println); // BANANA

性能與避坑指南

  • 基本類型數組排序:JDK 使用雙軸快速排序,比傳統快排更抗退化,全基本類型專用
  • 對象數組排序:使用 TimSort(歸併+插入混合),穩定、對部分有序數據極快
  • parallelSort 閾值:數組長度 < 8192 時自動退化為串行,小數組無需並行
  • binarySearch 前提:必須已按相同規則排序,否則結果不可預期
  • asList(T...) 返回固定長度 List,不支援 add/remove,需 `new ArrayList<>(Arrays.asList(...))`
  • 多線程環境下 Arrays.sort 非線程安全,共享數組需自行加鎖或用並行流

進階:自定義比較器排序對象數組


User[] users = {new User(3,"C"), new User(1,"A"), new User(2,"B")};
// 按 id 升序
Arrays.sort(users, Comparator.comparingInt(User::getId));
// 按 name 降序
Arrays.sort(users, Comparator.comparing(User::getName).reversed());
// 多鍵排序:先 id 升序,id 相同按 name 降序
Arrays.sort(users, Comparator
    .comparingInt(User::getId)
    .thenComparing(Comparator.comparing(User::getName).reversed()));

掌握 Arrays 這把「瑞士軍刀」,能讓你在處理數組時少寫大量樣板代碼,專注於業務邏輯。建議收藏本文速查表,下次寫到 for (int i=0; i<arr.length; i++) 時先想一想:Arrays 有沒有現成方法?

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