Arrays.copyOfRange是Java中高效安全的数组截取工具,支持左闭右开区间、越界自动补默认值、空数组安全,适用于分页、日志截断、递归子数组传递等场景。

Arrays.copyOfRange 是 Java 中最实用的数组截取工具,它不改原数组、自动校验边界、语义清晰,且性能接近底层 native 方法。用对了,能省去手动计算索引、预分配数组、防越界等一堆琐事。
什么时候该用 copyOfRange?
核心判断标准:你需要一个**新数组**,内容是原数组某段连续子序列,且不想自己 new 数组、算长度、写循环。
- 分页取数据(如第 20~29 条)
- 日志或缓冲区截断前 N 项
- 递归中传入子数组(如快排分区、二分查找缩小区间)
- 临时备份某段状态,避免后续修改影响原逻辑
正确用法与关键细节
语法统一为:Arrays.copyOfRange(original, from, to),注意三点:
- from 包含,to 不包含 —— 是 [from, to) 左闭右开区间,和 for 循环习惯一致
- to 可以大于 original.length —— 此时超出部分自动补默认值(int 填 0,String 填 null),不会抛异常
-
空数组安全 —— 对长度为 0 的数组调用
copyOfRange(arr, 0, 0)返回空数组,不报错
常见踩坑点
多数问题出在索引理解偏差或类型误判:
立即学习“Java免费学习笔记(深入)”;
- 把
to当成“长度”用,写成copyOfRange(arr, 0, 5)想取前 5 个是对的,但写成copyOfRange(arr, 0, arr.length + 1)就越界了 - 对象数组(如
String[]或MyObj[])拷贝的是引用,不是深拷贝 —— 若元素本身可变(如 StringBuilder),新旧数组指向同一对象 - 混淆
copyOfRange和copyOf:copyOf(arr, len)是按长度扩容/截断;copyOfRange是按索引切片,二者目的不同
性能表现与替代方案对比
底层直接调用 System.arraycopy,JVM 高度优化,实测性能与 clone() 相当,远优于手写 for 循环。
- 比
clone()灵活:支持任意区间,不止全量 - 比
System.arraycopy()简单:不用提前 new 目标数组,也不用算目标偏移 - 比手动循环可靠:自动做
from/to范围校验,避免下标错位导致静默错误



















