在Java里如何对集合进行排序_Collections排序方式解析

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

Java中对集合排序主要依靠 Collections 工具类和 Stream API,核心在于元素是否实现 Comparable 接口,或是否提供 Comparator。没有统一“万能排序方法”,选哪种方式取决于集合类型、是否允许修改原集合、是否需要自定义规则。

使用 Collections.sort() 对 List 排序(最常用)

该方法只适用于 List(如 ArrayListLinkedList),且要求元素可比较。

  • 若元素本身实现 Comparable(如 StringInteger),直接调用:
    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:
    List sorted = set.stream().sorted().collect(Collectors.toList());
  • TreeSet 本身自动排序,但它是按自然顺序或指定 Comparator 构建时就排好,不是“对已有 Set 排序”。

用 Stream.sorted() 实现函数式排序(推荐用于新代码)

Stream 方式更灵活、不修改原集合,支持链式操作,适合过滤+排序+映射等组合场景:

  • 基础排序:list.stream().sorted().collect(Collectors.toList());
  • 逆序:list.s

    tream().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)。