Collections.sort() 是排序 ArrayList 的最快最稳方案,基于双轴快排,平均时间复杂度 O(n log n),原地排序,要求元素实现 Comparable 或传入 Comparator。

用 Collections.sort() 排序 ArrayList 最快最稳
对 ArrayList 这类可变长、支持随机访问的列表,Collections.sort() 是首选。它底层调用的是 Arrays.sort() 的双轴快排(Java 7+),时间复杂度平均 O(n log n),且原地排序、不新建集合。
注意:元素必须实现 Comparable 接口,或显式传入 Comparator。否则运行时抛 ClassCastException 或 IllegalArgumentException。
- 基本类型包装类(如
Integer、String)已实现Comparable,可直接排序 - 自定义类需重写
compareTo(),或在sort()中传Comparator.comparing(...) - 若列表含
null,默认比较器会抛NullPointerException;可用Comparator.nullsFirst()或nullsLast()显式处理
Collections.sort(list); // 自然序 Collections.sort(list, Comparator.comparing(Person::getAge).reversed());
对 TreeSet / TreeMap 要理解“构造时定序”
TreeSet 和 TreeMap 不是“排序工具”,而是“天然有序”的数据结构。它们的顺序由创建时传入的 Comparator 或元素自身的 compareTo() 决定,插入即维护红黑树结构 —— 所以没有“先插入再统一排序”的概念。
常见误用:往已存在的 TreeSet 里反复 add() 后,以为要再调一次 sort();其实只要构造正确,每次 iterator() 都返回升序结果。
立即学习“Java免费学习笔记(深入)”;
- 无参构造:依赖元素
Comparable实现,若不满足则抛ClassCastException - 带
Comparator构造:优先使用该比较器,可安全容纳不实现Comparable的对象 - 不能混用自然序和自定义序:比如用
String建TreeSet后再塞入Integer,必然失败
流式排序:stream().sorted() 适合链式操作但别滥用
Stream.sorted() 返回新流,不修改原集合,适合函数式风格或需要中间操作(如 filter + sorted + limit)的场景。但它会触发完整遍历,且返回的是 Stream,如需集合得接 collect(Collectors.toList())。
性能上,小数据量差异不大;大数据量时,因涉及装箱、lambda 调用开销、额外对象分配,通常比 Collections.sort() 慢 10%–30%。
- 升序:
list.stream().sorted().collect(Collectors.toList()) - 降序:
list.stream().sorted(Collections.reverseOrder()).collect(...) - 避免写成
list.stream().sorted((a,b) -> b.compareTo(a))—— 直接用reverseOrder()更清晰、少出错 - 若后续还要遍历多次,别反复调
stream().sorted(),应先sort()原集合或缓存结果
Arrays.sort() 只能用于数组,别往 List 上硬套
看到 “sort” 就下意识写 Arrays.sort(myList) 是高频错误。编译会直接报错:no suitable method found for sort(List)。因为 Arrays.sort() 重载方法只接受原始数组(int[]、Object[] 等),不接受 List 接口。
如果手头是 List,想用 Arrays.sort(),必须先转数组:myList.toArray(),但要注意:返回的是 Object[],对泛型集合需强转,且排序后需手动拷回原集合 —— 此时不如直接用 Collections.sort() 简洁安全。
- 对原始类型数组(如
int[]):只能用Arrays.sort(arr),Collections不支持 - 对
String[]等引用类型数组:两个 API 都可用,但Arrays.sort()更直接 - 把
List转成String[]再排序,再转回List,纯属绕路
排序逻辑看似简单,但实际踩坑多在类型约束、null 处理、结构语义(如 TreeSet 的构造时机)和性能预期上。尤其注意:不是所有“集合”都支持相同排序方式,选错 API 要么编译不过,要么运行时报错,要么结果不符合预期。









