直接用Arrays.copyOfRange替换手工分页逻辑,代码更简洁安全;其from包含、to不包含的语义天然匹配分页需求,自动处理越界并返回空数组,但需调用方预先校验原数组非null。

直接用 Arrays.copyOfRange 替换手工计算索引+循环复制的分页截取逻辑,代码更简洁、边界更安全、可读性显著提升。
明确分页参数与数组范围的对应关系
传统分页常手动处理 startIndex 和 endIndex,容易出错(如越界、漏项、多取一项)。copyOfRange 的签名是 copyOfRange(T[] original, int from, int to),其中 from 包含,to 不包含——这恰好匹配“第 n 页,每页 size 条”的自然语义:
- 第 0 页:from = 0,to = size
- 第 1 页:from = size,to = size * 2
- 第 n 页:from = n * size,to = min((n + 1) * size, original.length)
一步替换循环复制,避免手动越界检查
旧代码常见写法:
int start = page * pageSize;
int end = Math.min(start + pageSize, data.length);
T[] pageData = (T[]) new Object[pageSize]; // 强制类型转换隐患
for (int i = start; i < end; i++) {
pageData[i - start] = data[i];
}用 copyOfRange 一行替代:
立即学习“Java免费学习笔记(深入)”;
T[] pageData = Arrays.copyOfRange(data, start, end);
它自动处理以下情况:
- 当
end > data.length时,内部按data.length截断,不抛异常 - 返回新数组,类型与原数组一致(泛型擦除下仍保持组件类型)
- 无需显式 new 数组、无需循环赋值、无需类型强制转换
结合 Optional 或空数组约定,统一空页处理
当请求页码超出范围(如 page=100,但总数据仅 5 条),copyOfRange 返回长度为 0 的新数组,而非 null。这是更健壮的设计:
- 避免调用方反复判空;可直接遍历或检查
length == 0 - 若业务要求返回
null表示无数据,只需加一层判断:return result.length == 0 ? null : result; - 搭配 Stream 使用也更自然:
Arrays.stream(Arrays.copyOfRange(data, from, to)).forEach(...)
注意原始数组为 null 时需单独防护
copyOfRange 不接受 null 原数组,会立即抛 NullPointerException。这不是它的职责,而是调用方应保障输入有效性:
- 在方法入口处快速失败:
Objects.requireNonNull(data, "data must not be null") - 或封装工具方法统一处理:
safeCopyOfRange(T[] data, int from, int to),内部先判空再调用 - 不要把 null 安全性交给
copyOfRange—— 它专注“范围复制”,不是“容错代理”


















