Arrays.copyOfRange 是 Java 中高效创建数组片段副本的核心工具,它封装边界检查与内存分配,支持安全切片、避免手动循环错误,返回新数组不影响原数组,底层调用 System.arraycopy,时间与空间复杂度均为 O(n)。

Arrays.copyOfRange 是 Java 中高效处理数组片段的核心工具,它能快速创建原数组某一段的副本,避免手动循环和边界判断错误。
copyOfRange 的基本用法与参数含义
该方法定义在 java.util.Arrays 类中,签名如下:
public static
其中 original 是源数组,from 是起始索引(包含),to 是结束索引(不包含)。注意:to 可以大于原数组长度,此时新数组会用 null(引用类型)或默认值(基本类型)填充;from 和 to 都必须非负,且 from ≤ to,否则抛出 IllegalArgumentException。
- 对 int[] 使用时,超出部分补 0;对 String[] 则补 null
- 若 from 超出数组长度,直接抛 ArrayIndexOutOfBoundsException
- 推荐先校验范围,尤其在动态计算索引时
替代传统 for 循环实现安全切片
手动遍历拷贝不仅冗长,还容易因 off-by-one 错误导致越界或漏数据。copyOfRange 封装了边界检查和内存分配逻辑,一行代码即可完成安全切片。
- 例如截取前 3 个元素:
int[] head = Arrays.copyOfRange(arr, 0, 3); - 获取从索引 2 到末尾:
int[] tail = Arrays.copyOfRange(arr, 2, arr.length); - 想复制整个数组?
Arrays.copyOfRange(arr, 0, arr.length)比 clone() 更明确意图
配合 Stream 或算法做分段计算
在需要对数组局部执行统计、排序或映射操作时,先用 copyOfRange 提取子数组,再交由其他工具处理,逻辑更清晰、副作用更少。
- 求中间 5 个元素的平均值:
double avg = Arrays.stream(Arrays.copyOfRange(data, start, start + 5)).average().orElse(0.0); - 对某段排序而不影响原数组:
int[] sortedPart = Arrays.copyOfRange(src, i, j); Arrays.sort(sortedPart); - 注意:返回的是新数组,原数组内容不受影响
性能与内存注意事项
copyOfRange 底层调用 System.arraycopy,时间复杂度为 O(n),空间复杂度也为 O(n)。它不是“视图”而是真实拷贝,适合读多写少、需隔离修改的场景。
立即学习“Java免费学习笔记(深入)”;
- 频繁切片大量数据时,考虑是否真需要每次新建数组,或改用 List.subList(返回视图,不复制)
- 基本类型数组拷贝较快;对象数组只拷贝引用,不深拷贝对象本身
- 如果只需访问而非修改,可直接用原数组加偏移计算,避免不必要的内存分配


















