Java Collections 工具類核心:sort 排序原理、Comparable 與 Comparator 實戰、中文排序方案
java.util.Collections 是操作集合的工具類,所有方法均為 static。核心方法 sort(List) 支援自然順序與自定義比較器兩種模式。本文深度解析泛型簽名、排序演算法、Comparator 實現技巧,並提供 Java/PHP 雙語言對比代碼。
一、Collections.sort 方法簽名解析
// 自然順序:元素必須實現 Comparable super T>
public static > void sort(List list)
// 自定義比較器:傳入 Comparator super T>
public static void sort(List list, Comparator super T> c)
泛型通配符解讀: ? super T 表示比較器能比較 T 及其父類型,體現逆變 特性,允許傳入比較範圍更大的比較器(如 Comparator 比較 String 列表)。
二、自然順序排序實戰
List list = Arrays.asList("aaa", "ccc", "bbb", "eee");
Collections.sort(list); // 字典序
System.out.println(list); // [aaa, bbb, ccc, eee]
List chinese = Arrays.asList("陶", "士", "涵");
Collections.sort(chinese); // 按 Unicode/ASCII 碼值排序
System.out.println(chinese); // [士, 涵, 陶] ← 非拼音序!
三、自定義 Comparator:按字符串長度排序
List list3 = Arrays.asList("aaa", "c", "bb", "eeee");
// 方式 1:匿名內部類(Java 7 風格)
Collections.sort(list3, new Comparator() {
@Override public int compare(String o1, String o2) {
int lenDiff = o1.length() - o2.length();
return lenDiff != 0 ? lenDiff : o1.compareTo(o2); // 長度相同按字典序
}
});
// 方式 2:Lambda 表達式(Java 8+ 推薦)
Collections.sort(list3, (o1, o2) -> {
int lenDiff = o1.length() - o2.length();
return lenDiff != 0 ? lenDiff : o1.compareTo(o2);
});
// 方式 3:Comparator 靜態工廠方法鏈(Java 8+ 最優雅)
Collections.sort(list3, Comparator
.comparingInt(String::length)
.thenComparing(Comparator.naturalOrder())
);
System.out.println(list3); // [c, bb, aaa, eeee]
四、中文排序:RuleBasedCollator 方案
import java.text.Collator;
import java.text.RuleBasedCollator;
import java.util.*;
List names = Arrays.asList("張三", "李四", "王五", "趙六");
Collections.sort(names, (o1, o2) -> {
RuleBasedCollator collator = (RuleBasedCollator) Collator.getInstance(Locale.CHINA);
return collator.getCollationKey(o1).compareTo(collator.getCollationKey(o2));
});
System.out.println(names); // [李四, 王五, 張三, 趙六] ← 按拼音序
五、PHP 對比實現(usort + 自定義比較函數)
六、性能與避坑指南
場景 建議 原因
大數據量排序 優先用 List.sort(Comparator)(Java 8+) 避免舊版 Collections.sort 內部轉數組再複製回列表的開銷
基本類型數組 用 Arrays.sort(int[]) 而非包裝類 List 避免裝箱/拆箱與對象頭開銷
穩定性要求 Java 8+ TimSort 穩定排序 相等元素相對位置不變,利於多關鍵字排序
比較器複用 定義為 static final 常量或單例 避免重複創建對象,利於 JIT 內聯優化
七、Collections 其他常用靜態方法速查
方法 功能
reverse(List)反轉列表順序
shuffle(List)隨機打亂順序
max/min(Collection)獲取最大/最小元素
frequency(Collection, Object)統計元素出現次數
binarySearch(List, key)二分查找(列表必須有序)
synchronizedList/Set/Map返回線程安全包裝視圖
unmodifiableList/Set/Map返回不可修改視圖(防御性編程)