Arrays.copyOfRange 是 Java 中最直接、安全的数组截取工具,语义清晰、自动校验边界、无需预分配数组,支持所有类型数组,返回新数组且不修改原数组。

Arrays.copyOfRange 是 Java 中最直接、安全的数组截取工具,适合需要“取一段、不改原数组、不手写循环”的场景。它语义清晰、边界自动校验、无需预分配目标数组,比 clone() 灵活,比 System.arraycopy 简洁。
日常分段提取:日志切片、分页缓存、算法中间状态
当处理一批数据但只需其中一部分时,比如从 100 条日志中取第 21–40 条做展示,或把大数组按块分发给多个线程处理:
- 取索引 20 到 40(共 20 个):Arrays.copyOfRange(logs, 20, 40)
- 跳过前 5 个,取剩余全部:Arrays.copyOfRange(data, 5, data.length)
- 复制整个数组(等价于 clone):Arrays.copyOfRange(arr, 0, arr.length)
边界安全截取:避免手写循环越界或漏判
手动 for 循环容易写错起止条件,而 copyOfRange 内置严格检查:from ≥ 0、to ≤ original.length、from ≤ to。一旦违规,立刻抛 ArrayIndexOutOfBoundsException,不会静默返回错误结果或空数组。
- 合法空截取:copyOfRange(arr, 3, 3) → 返回长度为 0 的新数组
- 空数组也能用:copyOfRange(new String[0], 0, 0) → 正常返回空数组
- 错误写法:copyOfRange(arr, 2, arr.length + 1) → 直接报错,不妥协
类型通用支持:基本类型与对象数组统一语法
无论 int[]、double[]、String[] 还是自定义类数组(如 Person[]),都用同一签名调用,编译器自动推导泛型。注意两点:
- 它只拷贝引用,不是深拷贝 —— 若数组元素是可变对象(如 StringBuilder[]),新旧数组共享同一实例
- 基本类型数组返回仍是基本类型数组(int[] → int[]),不会自动装箱成 Integer[]
替代方案对比:什么情况下该选它?
比起其他方式,copyOfRange 的优势很明确:
- 比 clone() 灵活:clone 只能全量复制;copyOfRange 可任意截取子段
- 比 System.arraycopy() 简单:不用自己 new 目标数组、不用算 destPos、不用传 length
- 比 手动 for 循环 可靠:省去索引计算和边界判断,杜绝 off-by-one 错误
- 不同于 List.subList():它返回真实新数组,修改副本不影响原数组,也不受原集合后续变更影响


















