Collections.sort()排序前需确保元素实现Comparable或传入Comparator,否则抛ClassCastException;反转应使用Collections.reverse()而非reverseOrder();Java 8+推荐用List.sort()替代Collections.sort()。

用 Collections.sort() 对 List 排序前必须确认元素可比较
直接调用 Collections.sort() 会抛 ClassCastException,除非 List 里的元素实现了 Comparable(比如 String、Integer),或者你传了自定义 Comparator。
常见错误现象:对 List<user></user> 直接排序,报错 java.lang.ClassCastException: User cannot be cast to java.lang.Comparable。
- 如果元素类型天然可比较(如
Integer、String),直接用Collections.sort(list) - 否则必须提供
Comparator:例如按User.name排序 →Collections.sort(list, Comparator.comparing(u -> u.name)) - 注意:
Collections.sort()只支持ArrayList等可变列表;对Arrays.asList()返回的“固定大小列表”有效,但对Stream.toList()(Java 16+)返回的不可变列表会抛UnsupportedOperationException
反转 List 用 Collections.reverse() 最简单,但别误用 sort() 模拟
有人想靠 Collections.sort(list, Collections.reverseOrder()) 来反转,这仅适用于元素本身实现了 Comparable 的场景,且逻辑上是“按逆序排”,不是“原地翻转”。真正要倒序排列结构,就该用 reverse()。
-
Collections.reverse(list)是原地操作,时间复杂度 O(n),不依赖元素类型 - 它不检查是否可比较,也不创建新集合,比手写循环或流式
Collectors.collectingAndThen(..., Collections::reverse)更轻量 - 副作用:如果
list是Arrays.asList()结果,反转后原数组也会被改 —— 因为底层共享数组
Java 8+ 更推荐用 List 自身的 sort() 方法而非 Collections.sort()
List.sort() 和 Collections.sort() 行为一致,但前者是实例方法,语义更清晰,且能更好配合 lambda 和方法引用。
- 排序:用
list.sort(Comparator.naturalOrder())或list.sort(Comparator.comparing(User::getAge)) - 反转:仍得用
Collections.reverse(list),因为List接口没定义reverse()方法 - 性能无差异,但
list.sort()在 IDE 中更容易触发类型推导,减少泛型警告 - 兼容性注意:Android API level List.sort(),老项目需回退到
Collections.sort()
不可变 List 上调用这些方法会立即失败
像 List.of()、Stream.toList()(Java 16+)、ImmutableList.copyOf()(Guava)返回的都是不可变视图。任何修改操作都会触发 UnsupportedOperationException。
- 错误示例:
Collections.sort(List.of(3, 1, 2))→ 报错 - 正确做法:先转成可变列表,例如
new ArrayList(List.of(3, 1, 2)),再排序或反转 - 如果只是临时需要有序结果,考虑用
list.stream().sorted().collect(Collectors.toList()),它天然产出新列表,不污染原数据
List 参数,背后可能是只读包装、代理、甚至空实现,不检查就调 sort 或 reverse 必崩。

















