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

計算機程序思維邏輯(31):Java Arrays 工具類全解析與多維數組操作實戰

     編輯:Java 綜合教學

Arrays 核心方法速查

方法類別代表方法說明
字符串化toString(int[]), deepToString(Object[])優雅輸出數組內容,多維遞歸
排序sort(int[]), sort(T[], Comparator)基本類型雙樞軸快排,對象 TimSort(穩定)
二分查找binarySearch(int[], key), binarySearch(T[], key, Comparator)前提:已排序;返回索引或 -(插入點+1)
拷貝copyOf(T[], newLen), copyOfRange(T[], from, to)底層 System.arraycopy,支持擴容/截取
比較equals(int[], int[]), deepEquals(Object[], Object[])長度+元素逐一比較,對象調用 equals
填充fill(int[], val), fill(int[], from, to, val)指定範圍賦值
哈希碼hashCode(int[]), deepHashCode(Object[])31 乘法累加,位置敏感
並行操作parallelSort, parallelPrefix, parallelSetAllJava 8+ 多核並行,大數組顯著提速
流式轉換stream(int[]), spliterator接入 Stream API

排序算法選擇邏輯

  • 基本類型:DualPivotQuicksort(Java 7+),雙樞軸快速排序,原地、不穩定、平均 O(n log n)
  • 對象類型:TimSort(Java 7+),歸並+插入混合,穩定,利用數據固有有序性
  • 小數組(< 47):插入排序,常數因子小
  • 並行排序:parallelSort 將數組分塊並行排序再歸並,閾值約 8192

Comparator 策略模式實戰

String[] arr = {"hello", "world", "Break", "abc"};

// 1. 忽略大小寫升序
Arrays.sort(arr, String.CASE_INSENSITIVE_ORDER); 
// [abc, Break, hello, world]

// 2. 忽略大小寫降序 - 匿名內部類
Arrays.sort(arr, new Comparator<String>() {
    public int compare(String o1, String o2) {
        return o2.compareToIgnoreCase(o1); // 交換參數實現逆序
    }
});

// 3. 降序 - Collections 工具
Arrays.sort(arr, Collections.reverseOrder(String.CASE_INSENSITIVE_ORDER));

// 4. 自定義規則:長度優先,長度相同按字典序
Arrays.sort(arr, Comparator
    .comparingInt(String::length)
    .thenComparing(String.CASE_INSENSITIVE_ORDER));

體現策略模式:排序算法(不變)與比較策略(可變)分離,運行時動態注入。

二分查找細節

int[] sorted = {3, 5, 7, 13, 21};
Arrays.binarySearch(sorted, 13);  // 3 (找到)
Arrays.binarySearch(sorted, 11);  // -4 (未找到,插入點=3,即 -(3+1))

前提:數組必須按相同比較器已排序;若有重複元素,返回任一匹配索引(不保證首/尾)。

多維數組本質與操作

Java 無真正多維數組,int[][] 實為「數組的數組」:

int[][] matrix = new int[2][3]; // 2行3列
matrix[0] = new int[]{1,2,3};
matrix[1] = new int[5]; // 第二行長度可不同!

深度操作方法

  • deepToString:遞歸輸出 [[1, 2], [3, 4, 5]]
  • deepEquals:遞歸比較結構與內容
  • deepHashCode:遞歸計算哈希

Apache Commons Lang ArrayUtils 補充

Arrays 功能有限,ArrayUtils 提供豐富增強:

功能方法示例
翻轉reverse(int[])
查找indexOf(int[], val), lastIndexOf, contains
刪除remove(int[], index), removeAll(int[], indices...), removeElement
添加add(int[], element), add(int[], index, element), addAll(int[], int[]...)
判斷有序isSorted(int[])
轉基本類型toPrimitive(Integer[]), toObject(int[])

注意:數組長度固定,增刪實為「創建新數組+拷貝」,頻繁操作建議用 ArrayList。

原理速覽

  • toString:StringBuilder 循環拼接
  • copyOfRange:new int[to-from] + System.arraycopy
  • binarySearch:雙指針 low/high,中位 (low+high) >>> 1,無符號右移防溢出
  • sort:委派 DualPivotQuicksort/TimSort 靜態類,數百行優化代碼

最佳實踐建議

  1. 優先使用 Arrays 標準方法,避免手寫循環
  2. 大數組排序/查找考慮 parallelSort/parallelPrefix
  3. 需頻繁增刪、動態擴容 → ArrayList/LinkedList
  4. 多維數組稀疏/不規則 → List<List<T>> 或 Map 索引
  5. 引入 commons-lang3 獲得 ArrayUtils 補充功能

下一節將探討 Java 日期時間 API 的演進與實戰技巧。

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