在 Java 開發中,排序是處理集合與陣列時最基礎也最常見的操作。Java 標準庫提供了 java.util.Arrays 與 java.util.Collections 兩大工具類,分別針對陣列與集合提供高效的排序實現。本文將系統梳理這兩大 API 的使用方式、進階技巧與注意事項。
Arrays.sort() 針對基本型別陣列採用雙軸快速排序,針對物件陣列採用 TimSort(歸併排序改進版),穩定且高效。
public void arraySort() {
int[] arr = {1, 4, 6, 333, 8, 2};
Arrays.sort(arr); // 原地排序,預設升序
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
// 僅對索引 1 到 4(不含 5)的元素排序 Arrays.sort(arr, 1, 5);
Collections.sort() 僅接受 List 介面實現,內部將列表轉為陣列排序後再寫回,同樣採用 TimSort,穩定性極佳。
public void listSortAsc() {
List<Integer> list = new ArrayList<>();
list.add(1); list.add(55); list.add(9); list.add(0); list.add(2);
Collections.sort(list); // 元素需實作 Comparable
list.forEach(System.out::println);
}
public void listSortDesc() {
List<Integer> list = new ArrayList<>();
list.add(1); list.add(55); list.add(9); list.add(0); list.add(2);
// 匿名內部類寫法
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1; // 降序
}
});
// Java 8+ Lambda 簡寫(推薦)
// list.sort((o1, o2) -> o2 - o1);
// 或使用 Comparator 靜態方法
// list.sort(Comparator.reverseOrder());
list.forEach(System.out::println);
}
Comparator.nullsFirst() 或 nullsLast() 處理空值。Comparator.comparing(User::getAge).thenComparing(User::getName) 鏈式組合。Arrays.parallelSort() 利用多核心加速(Java 8+)。List.sort() 比 Collections.sort() 略快(避免轉陣列開銷)。| 場景 | API | 關鍵點 |
|---|---|---|
| 基本型別陣列 | Arrays.sort() | 原地排序,雙軸快排 |
| 物件陣列 | Arrays.sort() | 需實作 Comparable 或傳 Comparator |
| List 集合 | Collections.sort() / list.sort() | 穩定排序,支援 Lambda |
| 大數據量 | Arrays.parallelSort() | 多執行緒並行,閾值約 8192 元素 |