Java中List排序最直接方式是Collections.sort(),支持自然排序(类实现Comparable)和自定义排序(传入Comparator),仅适用于List,基于稳定高效的TimSort算法原地排序。

Java 中对 List 排序最直接的方式就是 Collections.sort(),它不造新集合、不复制数据,原地修改,效率高且语义清晰。核心就两条路:元素自己会比大小(自然排序),或者你告诉它怎么比(自定义排序)。
自然排序要求对象实现 Comparable
自然排序不是“默认自动排好”,而是依赖类是否实现了 Comparable 接口,并重写了 compareTo() 方法。String、Integer、LocalDate 等 JDK 内置类型都已实现,可直接用:
-
字符串按字典序升序:
Collections.sort(listOfStrings) -
整数按数值升序:
Collections.sort(numbers) -
自定义类需主动实现:比如 Student 想默认按学号排序,就得让 Student 实现
Comparable<Student>,并在compareTo中写return Integer.compare(this.id, other.id);
自定义排序用 Comparator 更灵活
当不想改原有类,或同一类需要多种排序逻辑(如按年龄、按姓名、先年龄后分数),就用 Comparator。它不侵入业务类,只在调用时传入规则:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 用 Lambda 最简洁:
Collections.sort(students, (s1, s2) -> Integer.compare(s1.getAge(), s2.getAge())); - 多字段组合推荐链式写法:
Comparator.comparing(Student::getAge).thenComparing(Student::getName) - 注意 null 安全:用
Comparator.nullsLast(Comparator.naturalOrder())避免空指针
必须是 List,不能是 Set 或 Map
Collections.sort() 只接受 List 类型参数,因为排序本质是按索引重排顺序,而 Set 无序、Map 以键值对为主结构。若要对 HashSet 排序,得先转成 ArrayList:new ArrayList<>(mySet);若需持久有序,直接用 TreeSet 或 LinkedHashMap 更合适。
立即学习“Java免费学习笔记(深入)”;
排序是稳定且原地的
它基于 TimSort(Python 同款算法),时间复杂度稳定在 O(n log n),相同元素的相对位置不会打乱。同时不返回新 List,而是直接修改原列表 —— 所以调用后原 list 就已有序,无需重新赋值。

















