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

Java Arrays.sort() 陣列排序完整指南:基本型別、物件、自訂比較器與並行排序

     編輯:Java 相關知識

基本型別陣列排序


int[] nums = {5, 2, 8, 1, 9};
Arrays.sort(nums); // 升序,原地排序
// 部分排序
Arrays.sort(nums, 1, 4); // 排序索引 1~3
  • 基本型別使用 Dual-Pivot QuickSort,平均 O(n log n),不穩定。
  • 不支援降序,需自行反轉或轉為物件陣列。

物件陣列排序


String[] words = {"banana", "apple", "cherry"};
Arrays.sort(words); // 自然順序 (Comparable)
// 自訂比較器
Arrays.sort(words, (a, b) -> b.length() - a.length()); // 長度降序
Arrays.sort(words, Comparator.reverseOrder()); // 自然順序倒轉
  • 物件陣列使用 TimSort(合併+插入混合),穩定,O(n log n)。
  • 元素必須實作 Comparable 或提供 Comparator。

並行排序 (Java 8+)


int[] large = new int[10_000_000];
// 隨機填充...
Arrays.parallelSort(large); // 多執行緒排序,適用大陣列
  • 閾值約 8192 元素以上才啟用並行,小陣列反而較慢。
  • 使用 ForkJoinPool 共用池,可透過 java.util.concurrent.ForkJoinPool.common.parallelism 調整執行緒數。

自訂物件排序完整範例


class Student implements Comparable<Student> {
    String name; int score;
    Student(String n, int s) { name=n; score=s; }
    @Override public int compareTo(Student o) {
        return Integer.compare(this.score, o.score); // 分數升序
    }
    @Override public String toString() { return name+":"+score; }
}

public class ArraysSortDemo {
    public static void main(String[] args) {
        Student[] arr = {
            new Student("小明", 85),
            new Student("小紅", 92),
            new Student("小藍", 78)
        };
        // 1. 自然順序 (分數升序)
        Arrays.sort(arr);
        System.out.println("自然順序:" + Arrays.toString(arr));

        // 2. 比較器:分數降序,同分按姓名升序
        Arrays.sort(arr, Comparator
            .comparingInt((Student s) -> -s.score)
            .thenComparing(Student::getName));
        System.out.println("分數降序:" + Arrays.toString(arr));

        // 3. 並行排序 (大陣列)
        // Arrays.parallelSort(arr);
    }
}

常見陷阱與最佳實踐

陷阱解決方案
基本型別無法降序轉為包裝類別陣列 Integer[] 用 Comparator.reverseOrder()
null 元素導致 NPE使用 Comparator.nullsFirst/Last 或預先過濾
修改原陣列影響其他引用排序前 Arrays.copyOf() 備份
比較器不一致導致異常確保 compare(a,b) == -compare(b,a) 且可傳遞性

效能基準參考 (JDK 17, 1000 萬 int)


Arrays.sort()       : ~1.2 秒
Arrays.parallelSort(): ~0.35 秒 (8 核心)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved