System.arraycopy 是大数组拷贝的最优解,需预分配目标数组;Arrays.copyOf 适合需新建数组的场景;Arrays.copyOfRange 专用于安全切片;clone() 适用于轻量级完整浅拷贝。

最快不等于最通用,关键看场景。小数组用循环可能更快,大数组必须靠 JVM 底层支持;要新建数组就别硬套 System.arraycopy,要复用缓冲区就别总写 Arrays.copyOf。
大数组拷贝:认准 System.arraycopy
这是 Java 中唯一能触发底层内存指令(如 rep movsb 或 SIMD)的标准方式,中大型数组(≥1000 元素)比 for 循环快 2–5 倍。但它不负责建数组,目标数组必须提前分配好且非 null。
- 参数顺序固定:源数组、源起始索引、目标数组、目标起始索引、元素个数——错一个就逻辑出错或异常
- 长度建议 ≥16:太小(如 ≤4)时 JNI 调用开销反而高于简单赋值
- 同类型搬运才高效:int[] 拷到 long[] 编译失败;String[] 可拷到 Object[],反之运行时报
ArrayStoreException - 原地移动也安全:左移自动正向搬,右移自动倒序搬,JVM 内部已处理覆盖风险
需要自动建新数组时:优先 Arrays.copyOf
语法简洁,一行搞定完整复制或扩容,内部调用的正是 System.arraycopy,只是帮你封装了 new 数组这一步。适合日常备份、状态快照、动态扩容等场景。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 完整复制:
int[] copy = Arrays.copyOf(src, src.length) - 扩容并填默认值:
arr = Arrays.copyOf(arr, arr.length * 2)(多出位置 int 填 0,引用类型填 null) - 缩容截断:
int[] head = Arrays.copyOf(data, 5)(只取前 5 个) - 注意:每次调用都隐含一次堆分配,高频小拷贝下不如复用已有数组 +
arraycopy
只取一段?用 Arrays.copyOfRange
专为“切片”设计,语义清晰、边界安全。from 包含,to 不包含,符合 Java 通用习惯,越界也不抛异常,空位自动补默认值。
立即学习“Java免费学习笔记(深入)”;
- 分页常用:
int[] page = Arrays.copyOfRange(logs, offset, offset + size) - 日志截断:
String[] recent = Arrays.copyOfRange(lines, Math.max(0, lines.length - 100), lines.length) - 比手动算下标 +
copyOf更不易出错,也比arraycopy少写两行和一个目标数组声明
极简完整拷贝:clone() 仍有一席之地
基本类型数组调用 .clone() 是高效浅拷贝,语法最短,无参数、不 import,返回类型还能被编译器自动推导。
- 写法:
int[] copy = arr.clone() - 适合单元测试造数据、工具类内部快速备份等轻量场景
- 注意:二维数组只拷外层引用,内层数组仍共享;对象数组也是浅拷贝,改副本中的对象实例会影响原数组
- 不支持指定长度或范围,仅限完整复制


















