arrays.copyofrange 是 java 数组切片的最优解,它自动创建新数组、语义清晰、边界严格校验,一次性完成范围确定、数组创建与数据复制,支持空数组且底层调用高效 native 方法 system.arraycopy。

Arrays.copyOfRange 是 Java 中最常用、最安全的数组切片工具,它不修改原数组,自动创建新数组,语义清晰且边界校验严格。对绝大多数日常场景来说,它不是“够用”,而是“最优解”——既省心又高效。
为什么 copyOfRange 是切片首选?
它把三件事一次性做完:确定范围、创建目标数组、复制数据。不用手动 new,不用算长度,也不用担心索引越界静默失败。
- 参数明确:from(含)到 to(不含),符合 Java 区间惯例,比如
copyOfRange(arr, 2, 5)就是取第 3~5 个元素(索引 2、3、4) - 自动校验:from arr.length 或 from > to 时直接抛
ArrayIndexOutOfBoundsException,不隐式截断 - 空数组友好:对长度为 0 的数组调用
copyOfRange(arr, 0, 0)返回空数组,不报错 - 底层高效:内部调用
System.arraycopy,是 JVM 优化过的 native 操作,比手写循环快 2–5 倍
切片实战中的高频用法
不需要额外封装,三参数就能覆盖大多数需求:
- 取前 N 个:
Arrays.copyOfRange(data, 0, N) - 跳过前 M 个取剩余:
Arrays.copyOfRange(data, M, data.length) - 复制整个数组(等价 clone):
Arrays.copyOfRange(data, 0, data.length) - 分页提取:
Arrays.copyOfRange(list, page * size, Math.min((page + 1) * size, list.length))(注意防越界)
性能关键点与避坑提醒
它快,但不是零成本。真正影响效率的,是使用方式而非方法本身:
- 每次调用都分配新内存 —— 大数组频繁切片会增加 GC 压力,循环内慎用
- 对象数组只拷贝引用,不是深拷贝;若元素是可变对象(如
StringBuilder[]),新旧数组仍共享同一实例 - to 允许大于原数组长度,超出部分填默认值(int→0,Object→null),但这是特例,非推荐用法
- 别和
List.subList混淆:copyOfRange 返回的是真实数组副本,不是视图,修改它不影响原数组
什么时候该换别的方案?
不是所有场景都适合 copyOfRange:
- 需要复用缓冲区(如网络收发)→ 用
System.arraycopy,手动管理目标数组 - 只读遍历或临时计算 → 根本不用拷贝,直接用原数组加索引偏移更轻量
- 要深拷贝嵌套结构(如二维对象数组)→ copyOfRange 不管用,得递归处理或借助工具类
- 极小数组(
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











