ArrayList本身不支持分页,但可通过subList()模拟:起始索引=(pageNum-1)pageSize,结束索引=min(pageNumpageSize, list.size()),需校验边界并封装为通用工具方法,适用于内存小数据分页;大数据应优先用SQL分页。

Java 中的 ArrayList 本身不支持分页,但可以通过计算索引范围,用 subList() 方法“模拟”分页效果。关键在于正确处理边界(如越界、空列表、负数页码等)。
计算起始和结束索引
分页需明确当前页码(pageNum)、每页条数(pageSize):
- 起始索引 =
(pageNum - 1) * pageSize(第一页从 0 开始) - 结束索引 =
Math.min(pageNum * pageSize, list.size())(防止越界) - 起始索引不能小于 0,结束索引不能大于
list.size()
用 subList 安全截取数据
subList() 返回原列表的视图,修改会影响原列表;如需独立副本,建议构造新 ArrayList:
int fromIndex = Math.max(0, (pageNum - 1) * pageSize);
int toIndex = Math.min(list.size(), pageNum * pageSize);
<p>if (fromIndex >= toIndex || fromIndex >= list.size()) {
return new ArrayList<>(); // 空页
}
List<T> pageData = new ArrayList<>(list.subList(fromIndex, toIndex));
封装成通用分页方法
推荐封装为静态工具方法,增强复用性和健壮性:
立即学习“Java免费学习笔记(深入)”;
public static <T> List<T> getPage(List<T> list, int pageNum, int pageSize) {
if (list == null || list.isEmpty() || pageNum < 1 || pageSize < 1) {
return new ArrayList<>();
}
int from = (pageNum - 1) * pageSize;
int to = Math.min(from + pageSize, list.size());
return from >= list.size() ? new ArrayList<>() : new ArrayList<>(list.subList(from, to));
}
调用示例:getPage(users, 2, 10) 获取第 2 页、每页 10 条。
注意性能与适用场景
该方式适合数据量不大(如内存中已加载的查询结果)的分页。若原始数据来自数据库,应优先使用 SQL 分页(如 MySQL 的 LIMIT offset, size 或 MyBatis 的 RowBounds),避免把全部数据加载到内存再裁剪。


















