Java集合排序无万能方法,主要用Collections.sort()(修改原List)和Stream.sorted(不修改原集合),需根据集合类型、是否可变及排序规则选择;TreeSet本身有序,数组用Arrays.sort(),Map需转entrySet处理。

Java中对集合排序主要依靠 Collections 工具类和 Stream API,核心在于元素是否实现 Comparable 接口,或是否提供 Comparator。没有统一“万能排序方法”,选哪种方式取决于集合类型、是否允许修改原集合、是否需要自定义规则。
使用 Collections.sort() 对 List 排序(最常用)
该方法只适用于 List(如 ArrayList、LinkedList),且要求元素可比较。
- 若元素本身实现
Comparable(如String、Integer),直接调用:Collections.sort(list); - 若需自定义顺序(比如按字符串长度、按对象某字段),传入
Comparator:Collections.sort(list, Comparator.comparing(Student::getAge)); - 注意:该方法会**直接修改原 List**,不返回新集合。
对不可变或非List集合排序(转成List再排)
Set、Queue 等本身无序,不能直接用 Collections.sort()。常见做法是先转为 ArrayList:
List
sorted = new ArrayList<>(set);
Collections.sort(sorted);- 若想一步到位并保持不可变语义,可用 Stream:
Listsorted = set.stream().sorted().collect(Collectors.toList()); - TreeSet 本身自动排序,但它是按自然顺序或指定 Comparator 构建时就排好,不是“对已有 Set 排序”。
用 Stream.sorted() 实现函数式排序(推荐用于新代码)
Stream 方式更灵活、不修改原集合,支持链式操作,适合过滤+排序+映射等组合场景:
立即学习“Java免费学习笔记(深入)”;
- 基础排序:
list.stream().sorted().collect(Collectors.toList()); - 逆序:
list.stream().sorted(Collections.reverseOrder()).collect(...); - 按对象字段:
list.stream().sorted(Comparator.comparing(Product::getPrice)).collect(...); - 多级排序:
sorted(Comparator.comparing(Student::getGrade).thenComparing(Student::getName))
自定义 Comparator 的几种实用写法
除了方法引用,还可手写逻辑,应对复杂判断:
- 匿名内部类(老式写法,少用):
Collections.sort(list, new Comparator() { public int compare(String a, String b) { return a.length() - b.length(); } }); - Lambda 表达式(简洁):
Collections.sort(list, (a, b) -> a.length() - b.length()); - 空值安全处理(推荐):
Comparator.nullsLast(Comparator.comparing(User::getName))
不复杂但容易忽略:数组用 Arrays.sort(),Map 没有内置排序,需转为 entrySet() 流式处理;所有排序前提都是元素非 null(除非显式处理 null)。










