arrays.copyofrange是java中最直接、安全且语义清晰的数组切片工具,三参数即可截取任意区间,from包含、to不包含,自动校验边界并底层调用system.arraycopy,支持所有数组类型,适用于分页、日志截断等场景。

Arrays.copyOfRange 是 Java 中实现数据切片最直接、安全且语义清晰的工具,它专为“取一段”而生,无需手动创建目标数组、自动校验边界、底层调用高效 native 方法,适合绝大多数分页、日志截断、批量预处理等场景。
核心用法:三参数搞定任意区间截取
语法统一为 Arrays.copyOfRange(original, from, to),其中:
-
from 是起始索引(包含),对应第
from + 1个元素 -
to 是结束索引(不包含),实际复制到
to - 1位置 - 合法范围必须满足
0 ≤ from ≤ to ≤ original.length,否则抛ArrayIndexOutOfBoundsException - 若
from == to,返回长度为 0 的空数组,无需额外判空
典型切片场景与写法示例
日常开发中高频使用模式:
- 取前 N 个元素:
Arrays.copyOfRange(arr, 0, N) - 跳过前 M 个取剩余:
Arrays.copyOfRange(arr, M, arr.length) - 复制整个数组(等价于 clone):
Arrays.copyOfRange(arr, 0, arr.length) - 分页获取第 page 页(每页 size 条):
Arrays.copyOfRange(data, (page - 1) * size, Math.min(page * size, data.length))
关键细节与避坑要点
看似简单,但几个细节决定是否稳定可用:
-
越界行为明确:若
to > original.length,不会报错,而是用默认值填充(int[]填 0,String[]填null) -
对象数组只拷贝引用:对
StringBuilder[]或自定义对象数组,新数组中元素仍指向原对象,修改内容会影响原数组;需深拷贝时应单独处理对象实例 -
空数组完全兼容:对长度为 0 的数组调用
copyOfRange(arr, 0, 0)正常返回空数组,无异常 -
类型全覆盖:支持所有基本类型数组(
int[]、double[]等)和引用类型数组(String[]、MyClass[]),行为一致
对比其他方式:为什么它更适合切片
不是所有拷贝方法都适合“取一段”:
-
vs
clone():只能全量复制,无法指定范围;且返回Object需强制转型 -
vs
Arrays.copyOf():虽可扩容/缩容,但本质是“按长度复制前 N 个”,要截取中间段需先算偏移再配合copyOf,易出错 -
vs
System.arraycopy():性能更高,但必须提前分配目标数组、手动管理下标、无自动越界检查,适合高频底层操作而非业务逻辑切片
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











