ArrayList 本身不提供分页方法,但可通过 subList() 实现逻辑分页:起始索引为 (currentPage-1)*pageSize,结束索引为 Math.min(fromIndex+pageSize, list.size()),并用 new ArrayList() 包装子列表以避免视图关联问题。

Java 中的 ArrayList 本身不提供分页方法,但可以通过计算起始索引和截取长度,用 subList() 实现逻辑分页。
计算起始索引和截取数量
分页关键在于确定当前页的起始位置(fromIndex)和要取多少条(pageSize)。注意:索引从 0 开始,且不能越界。
- 起始索引 = (currentPage - 1) * pageSize(第一页是 page=1)
- 结束索引 = Math.min(fromIndex + pageSize, list.size())
- 需确保
fromIndex < list.size(),否则抛IndexOutOfBoundsException
安全调用 subList() 截取数据
subList() 返回的是原列表的视图(非新 ArrayList),修改会影响原列表。如需独立副本,应包装成新 ArrayList。
- 基础截取:
list.subList(fromIndex, toIndex) - 生成新列表(推荐):
new ArrayList(list.subList(fromIndex, toIndex)) - 若
fromIndex >= list.size(),直接返回空列表,避免异常
封装一个通用分页工具方法
把边界判断和截取逻辑收拢,提高复用性和健壮性:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
public static <T> List<T> paginate(List<T> data, int currentPage, int pageSize) {
if (data == null || data.isEmpty() || currentPage < 1 || pageSize < 1) {
return new ArrayList<>();
}
int fromIndex = (currentPage - 1) * pageSize;
int toIndex = Math.min(fromIndex + pageSize, data.size());
if (fromIndex >= data.size()) {
return new ArrayList<>();
}
return new ArrayList<>(data.subList(fromIndex, toIndex));
}
使用示例:paginate(users, 2, 10) 表示取第 2 页、每页 10 条。
注意 subList 的“坑”
subList 返回的子列表与原列表强关联:
- 对子列表调用
add()、remove()会抛UnsupportedOperationException(除非原列表也支持) - 修改原列表结构(如
clear()、remove())可能导致子列表失效或抛ConcurrentModificationException - 只要不修改结构,读取和遍历是安全的;需要独立操作时务必用
new ArrayList(...)

















