java中对list排序最常用可靠的方式是collections.sort(),它原地排序、效率高,支持自然排序(类实现comparable接口)和自定义排序(传入comparator),仅适用于list,基于稳定高效的timsort算法。

Java里对List排序,最常用也最可靠的方式就是Collections.sort()。它不新建对象、不复制数据,直接改原列表,效率高还语义清楚。核心就两条路:让元素自己会比大小(自然排序),或者你临时告诉它怎么比(自定义排序)。
自然排序:类实现Comparable接口
自然排序不是“自动排好”,而是要求类明确实现了Comparable接口,并重写compareTo()方法。JDK内置类型如String、Integer、LocalDate都已实现,可直接用:
- 字符串按字典序升序:
Collections.sort(listOfStrings) - 整数按数值升序:
Collections.sort(numbers) - 自定义类如
Student想默认按学号排序,就得让它实现Comparable<student></student>,并在compareTo中写return Integer.compare(this.id, other.id);
自定义排序:用Comparator更灵活
当不想改原有类,或同一类需要多种排序逻辑(比如按年龄、按姓名、先年龄后分数),就用Comparator。它不侵入业务代码,只在调用时传入规则:
- 用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更合适。
排序是稳定且原地的
它基于TimSort(Python同款算法),时间复杂度稳定在O(n log n),相同元素的相对位置不会打乱。同时不返回新List,而是直接修改原列表——所以调用后原list就已有序,无需重新赋值。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











