ArrayList分页需用subList()实现逻辑分页,时间复杂度O(1),通过计算from=(pageNum-1)*pageSize和to=Math.min(size,from+pageSize)截取视图,注意边界校验、空值处理及修改影响原列表。

Java 中 ArrayList 本身不支持数据库式的分页查询,但可以通过截取子列表实现逻辑分页。关键在于避免全量加载+遍历,而是用 subList() 直接定位,时间复杂度 O(1) —— 因为它返回的是原列表的视图,不复制数据。
用 subList() 快速获取指定页的数据
subList(fromIndex, toIndex) 是最直接高效的方式。注意:索引左闭右开,且需手动校验边界,防止 IndexOutOfBoundsException。
- 计算起始索引:
int from = Math.max(0, (pageNum - 1) * pageSize) - 计算结束索引:
int to = Math.min(list.size(), from + pageSize) - 调用:
List<t> pageData = list.subList(from, to)</t>
封装成可复用的分页工具方法
把边界处理和空值检查收拢起来,避免每次重复写。例如:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
<font color="#888">public static <T> List<T> paginate(List<T> source, int pageNum, int pageSize) {
if (source == null || source.isEmpty() || pageNum < 1 || pageSize < 1) {
return Collections.emptyList();
}
int from = (pageNum - 1) * pageSize;
int to = Math.min(source.size(), from + pageSize);
return from >= source.size() ? Collections.emptyList() : source.subList(from, to);
}</font>注意 subList 返回的是“视图”,不是新副本
返回的子列表与原 ArrayList 共享底层数组。这意味着:
立即学习“Java免费学习笔记(深入)”;
- 修改子列表会影响原列表(如
set()、remove()) - 若需独立副本,显式构造:
new ArrayList(list.subList(from, to)) - 子列表不支持
add()或clear()(会抛UnsupportedOperationException)
大数据量时慎用:内存与场景匹配
ArrayList 分页只适合数据已全部加载到内存的场景(如缓存、配置项、小规模结果集)。如果原始数据来自数据库且量大,应优先在 SQL 层分页(LIMIT offset, size 或 ROW_NUMBER()),而不是把几万条记录全查进内存再分页。

















