Java中拆分ArrayList为多个小列表推荐使用Collections.subList()配合new ArrayList()封装,核心是按固定大小切分、避免越界、确保子列表独立;通用工具方法partition(list, size)返回List<List<T>>,空列表和非法size需校验。

Java 中拆分 ArrayList 为多个小列表,核心是按固定大小(如每页 10 条)切分,常用方式有手动循环、Collections.subList() 或借助工具类(如 Guava、Apache Commons)。关键点是避免越界、保留原列表不变、不创建冗余对象。
用 subList() 手动分片(推荐,无依赖)
subList() 返回原列表的视图,轻量高效,但注意它返回的是“活”的子列表——修改会影响原列表。若需独立副本,要包装进新 ArrayList。
- 计算总段数:
(list.size() + size - 1) / size(向上取整) - 遍历起始索引:
i = 0, size, 2*size, ...,每次取subList(i, Math.min(i + size, list.size())) - 用
new ArrayList(...)复制,确保子列表彼此隔离
封装成通用工具方法
写一个静态方法,输入源列表和每份大小,返回 List<List<T>>:
public static <T> List<List<T>> partition(List<T> list, int size) {
if (list == null || size <= 0) throw new IllegalArgumentException();
List<List<T>> result = new ArrayList<>();
for (int i = 0; i < list.size(); i += size) {
result.add(new ArrayList<>(list.subList(i, Math.min(i + size, list.size()))));
}
return result;
}调用示例:partition(myList, 5) → 每组最多 5 个元素的嵌套列表。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
使用 Apache Commons Collections(简洁)
添加依赖后,一行搞定:
List<List<String>> parts = ListUtils.partition(originalList, 10);
注意:它内部也是用 subList 实现,同样返回独立副本,无需额外包装。
注意事项与避坑
-
不要直接用 subList 结果长期持有:原列表被修改时,子列表可能抛
ConcurrentModificationException - size 为 0 或负数必须校验,否则循环不终止或下标越界
-
空列表输入要兼容:
partition(Collections.emptyList(), 5)应返回空的外层列表,而非null - 若需流式处理(如分批入库),可配合
Stream.iterate或自定义 Spliterator,但日常分页用上述方法更直观

















