Arrays.copyOfRange是最简洁安全的数组截取方式,用于创建原数组指定范围的新数组,不修改原数组,支持所有数组类型,底层调用System.arraycopy,语义清晰且自动校验索引。

Java中数组拷贝有多种方式,Arrays.copyOfRange 是最简洁、安全且语义明确的一种,特别适合按需截取子数组。
核心作用:从原数组提取一段连续元素生成新数组
它不修改原数组,而是创建一个类型相同、长度为指定范围的新数组,并将原数组中 from(含)到 to(不含) 的元素复制进去。注意:to 是结束索引(exclusive),不是长度。
- 如果
from < 0或to > original.length或from > to,会抛出ArrayIndexOutOfBoundsException - 支持所有基本类型数组和对象数组(如
String[]、Integer[]) - 底层调用
System.arraycopy,性能高效
基本用法:三参数搞定截取
语法统一为:Arrays.copyOfRange(T[] original, int from, int to),其中 T 是数组元素类型。
- 截取前3个元素:
int[] sub = Arrays.copyOfRange(arr, 0, 3); - 跳过前2个取后面全部:
String[] rest = Arrays.copyOfRange(strs, 2, strs.length); - 复制整个数组(等价于
clone()):double[] copy = Arrays.copyOfRange(doubles, 0, doubles.length);
常见易错点与避坑提示
初学者常因索引理解偏差导致异常或结果不符预期。
立即学习“Java免费学习笔记(深入)”;
-
to 必须 ≤ original.length,写成
arr.length + 1就会越界 -
空数组也能用:对长度为0的数组调用
copyOfRange(arr, 0, 0)返回空数组,不报错 -
对象数组拷贝的是引用:若原数组存的是可变对象(如
StringBuilder[]),新数组里的元素仍指向原对象,内容未深拷贝
对比其他拷贝方式:何时选它?
相比 clone()、System.arraycopy() 或手动循环,copyOfRange 的优势在于语义清晰、边界安全、无需预分配目标数组。
- 比
clone()灵活:能取任意子段,不止全量 - 比
System.arraycopy()简单:不用自己 new 目标数组、不用算偏移量 - 比循环更可靠:自动做范围校验,避免手写循环时索引错位

















