Arrays.copyOfRange是Java中最接近原生数组切片的工具,用于创建原数组指定范围的新副本,不修改原数组,支持泛型与基本类型,from包含、to不包含,越界时自动补默认值。

Java 中没有原生的“数组切片”语法,但 Arrays.copyOfRange 是最接近、最常用且零依赖的切片工具——它直接返回新数组,不修改原数组,语义清晰,性能可靠。
copyOfRange 的核心用法与参数含义
该方法定义在 java.util.Arrays 类中,签名如下:
public static <T> T[] copyOfRange(T[] original, int from, int to)public static int[] copyOfRange(int[] original, int from, int to)(其他基本类型同理)
关键点:
立即学习“Java免费学习笔记(深入)”;
-
from:起始索引(包含),从 0 开始,可为 0 或正数;若为负数会抛
ArrayIndexOutOfBoundsException - to:结束索引(不包含),必须 ≥ from,且 ≤ original.length;超过长度会自动补默认值(如 0、null)
- 返回一个全新数组,类型和原数组一致,长度 =
to - from
常见切片场景与写法示例
假设原始数组:int[] arr = {10, 20, 30, 40, 50};
- 取前 3 个元素:
Arrays.copyOfRange(arr, 0, 3)→{10, 20, 30} - 取后 2 个元素:
Arrays.copyOfRange(arr, 3, 5)→{40, 50} - 跳过首尾各 1 个:
Arrays.copyOfRange(arr, 1, 4)→{20, 30, 40} - 越界安全处理(to 超长):
Arrays.copyOfRange(arr, 2, 10)→{30, 40, 50, 0, 0, 0, 0, 0}(补 0)
与其它拷贝方式对比:为什么优先选 copyOfRange?
相比手动循环、System.arraycopy 或 Arrays.copyOf:
- 比手动循环简洁安全:无需写 for、不用判断边界,一行搞定
- 比 System.arraycopy 更易读:后者需指定目标数组、起始偏移等 5 个参数,语义模糊
-
比 Arrays.copyOf 更灵活:
copyOf只能从头拷贝,无法指定任意区间 - 无额外依赖:JDK 自带,无需引入第三方库(如 Apache Commons Lang 的 ArrayUtils)
注意事项与避坑提醒
使用时需留意几个实际细节:
- 空数组或 null 输入会直接抛
NullPointerException,调用前建议判空 - 当
from == to时,返回长度为 0 的空数组(合法且有用,比如条件截取为空) - 对引用类型数组,拷贝的是引用而非对象本身——即浅拷贝;若需深拷贝,需另行处理每个元素
- 对于大数据量频繁切片,注意内存分配开销;若只是临时视图需求,可考虑封装为不可变列表(如
Arrays.asList(...).subList(...)),但注意其底层仍引用原数组


















