Collections.sort排序前需确保元素可比较:String、Integer等自带Comparable接口可直接排序;自定义类如User须实现Comparable或传Comparator,否则抛ClassCastException;该方法原地修改List,不返回新集合。

用 Collections.sort 排序前必须确保元素可比较
如果 List 里是 String、Integer 这类自带 Comparable 实现的类型,直接调用 Collections.sort(list) 就行;但要是自定义对象(比如 User),不实现 Comparable 或不传比较器就会抛 ClassCastException。
- 错误现象:
java.lang.ClassCastException: com.example.User cannot be cast to java.lang.Comparable - 解决办法:要么让
User实现Comparable<User>,要么在sort时传入Comparator - 注意:该方法会**原地修改**原 List,不返回新集合
Lambda 写法本质是构造 Comparator 实例
Collections.sort(list, (a, b) -> a.getAge() - b.getAge()) 看似简洁,其实等价于传入一个匿名 Comparator 对象——它不是语法糖,而是函数式接口的实例化。
- 常见写法:
(a, b) -> Integer.compare(a.getAge(), b.getAge())比减法更安全,避免整数溢出 - 升序/降序:升序用
a.compareTo(b),降序用b.compareTo(a)或Comparator.reverseOrder() - 链式比较:多个字段排序建议用
Comparator.comparing(User::getName).thenComparing(User::getAge),比嵌套三目更清晰
别在 ArrayList 之外盲目用 Collections.sort
这个方法只接受 List,且底层依赖随机访问性能。对 LinkedList 调用它,虽然能跑通,但时间复杂度从 O(n log n) 退化为 O(n² log n),因为每次索引访问都是 O(n)。
- 真实场景中,如果你拿到的是
List<?>参数,先判断具体类型再决定是否转成ArrayList再排序 - Java 8+ 更推荐用流式写法:
list.stream().sorted(Comparator.comparing(User::getAge)).collect(Collectors.toList()),语义更明确,且不修改原集合 - 但要注意:流式排序会新建 List,内存开销略高;而
Collections.sort原地操作,适合大数据量且允许修改原集合的场景
Arrays.sort 和 Collections.sort 别混用
数组和集合走的是两套逻辑:Arrays.sort 处理 int[]、Object[] 等数组,Collections.sort 只处理 List。试图把 list.toArray() 的结果传给 Arrays.sort 并不会影响原 List。
立即学习“Java免费学习笔记(深入)”;
- 错误示例:
Arrays.sort(list.toArray());—— 这只是排了一个临时数组副本,list完全没变 - 正确做法:要改原集合,就用
Collections.sort(list, ...);要排数组,先确保变量是Object[]或基本类型数组,再用对应Arrays.sort - 兼容性提醒:低版本 Android(API 23 以下)对 Lambda 支持有限,
Comparator.comparing可能触发验证错误,此时得退回匿名内部类写法
事情说清了就结束


















