应根据场景选择:需新数组并调整长度用Arrays.copyOf,已有目标数组且需精确控制复制位置用System.arraycopy,仅等长复制则优先clone()。

选 Arrays.copyOf 还是 System.arraycopy,关键不在“哪个更高级”,而在于你手上的数组、目标动作和性能约束是否匹配。
需要新数组 + 调整长度 → 用 Arrays.copyOf
这是日常开发中最常见的需求:备份、扩容、截取前 N 个、补默认值。它一步到位,不用操心 new 数组、类型对齐或边界计算。
- 扩容模拟 ArrayList:比如原数组长度为 4,要扩到 6,
Arrays.copyOf(arr, 6)直接返回新数组,后两位自动填 0 或 null - 安全截断:想只保留前 3 个元素,
Arrays.copyOf(arr, 3)比手动循环或判断长度更简洁、不易越界 - 类型转换场景:需把
int[]转成Number[]容器,用重载版Arrays.copyOf(ints, len, Number[].class),避免返回Object[]
已有目标数组 + 需精确控制复制位置 → 用 System.arraycopy
当你已经有复用的缓冲区、要覆盖写入某段内存、或在循环中高频搬运数据时,System.arraycopy 是唯一选择——它不分配新对象,也不做额外校验,纯粹搬数据。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- ArrayList 删除元素后移动后续项:
System.arraycopy(elements, index+1, elements, index, size - index - 1) - 滑动窗口右移一位:
System.arraycopy(src, 1, dest, 0, windowSize),比新建数组省 GC 开销 - 拼接两个数组片段:把 A 的后 2 个和 B 的前 3 个合并进一个已有数组,分两次调用即可,
copyOf做不到
追求极致性能 or 处理大数组 → 优先 System.arraycopy
虽然两者底层都走 JVM 的 native 内存拷贝,但 System.arraycopy 少一层 Java 层封装(如数组创建、min 长度计算),在热点路径中更可控。
立即学习“Java免费学习笔记(深入)”;
- 网络包解析、音视频帧处理等每毫秒都敏感的场景,直接用
arraycopy可避免隐式对象分配 - 批量 resize 动态结构(如自定义队列)时,若目标数组已预分配,反复调用
arraycopy比不断 new + copyOf 更省内存 - 注意:它不检查类型兼容性,运行时才抛
ArrayStoreException;参数顺序错(如 srcPos/destPos 混淆)会导致静默覆盖,务必校验
只是完整复制、图省事 → clone() 往往更合适
如果目标就是“一模一样复制一份”,且不需要改长度,arr.clone() 比 Arrays.copyOf(arr, arr.length) 更快、更短、更语义明确。
- 基本类型数组:
int[] copy = original.clone()是最快等长复制方式 - 对象数组:仍是浅拷贝,但语法最简;二维数组需注意,
matrix.clone()只复制外层数组,内层数组仍共享 - 不支持泛型擦除后的类型推导,但无需传
Class参数,也无长度参数易输错风险

















