ArrayList不支持直接部分排序,但可通过subList获取原列表视图并用Collections.sort()原地排序指定区间;或手动复制子列表、排序后回填。

Java 中 ArrayList 本身不支持直接对“部分元素”排序,但可以通过截取子列表、排序后再写回原集合的方式实现。关键在于:**操作的是原列表的视图或副本,排序后需手动更新对应位置**。
用 Collections.sort() 配合子列表(推荐)
ArrayList.subList(fromIndex, toIndex) 返回的是原列表的可修改视图(不是副本),对它排序会直接影响原列表中对应范围的元素。
注意:toIndex 是exclusive(不包含),且子列表必须是连续的。
- 确保索引合法:
0 ≤ fromIndex ≤ toIndex ≤ list.size() - 调用
Collections.sort(subList)即可原地排序该区间 - 若需自定义顺序,传入
Comparator,例如按字符串长度排序:
手动复制 + 排序 + 回填(更安全,适合复杂逻辑)
当需要排序逻辑依赖外部状态、或担心 subList 的并发/结构修改风险时,可显式拷贝、排序、再逐个写回。
立即学习“Java免费学习笔记(深入)”;
- 用
list.subList(...).toArray()或new ArrayList(subList)创建副本 - 对副本排序(可用
Arrays.sort()或Collections.sort()) - 用循环把排好序的元素重新赋值到原列表的对应位置
使用 Stream 截取并排序(仅适用于生成新列表,不改原列表)
如果目标是“提取某段、排序、得到新列表”,Stream 很简洁;但它不会修改原 ArrayList,适合只读场景。
- 用
stream().skip().limit()或subList().stream() - 接
sorted()和collect(Collectors.toList())
注意事项与常见坑
-
subList返回的子列表不允许 add/remove,否则抛UnsupportedOperationException(因其底层仍指向原数组) - 排序期间不要对原
ArrayList做add/remove,否则子列表可能失效(抛ConcurrentModificationException) - 基本类型包装类(如
Integer)默认按自然序排序;自定义对象务必实现Comparable或提供Comparator


















