基本型別陣列排序
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 核心)