Java算法竞赛中数组拷贝应按场景选择:大数组用System.arraycopy(高效、支持偏移),完整复制或扩容用Arrays.copyOf(简洁、自动建数组),快速浅拷贝用clone()(语法简、类型安全);避免直接赋值和低效循环。

在 Java 算法竞赛中,数组拷贝看似简单,但选错方法可能拖慢运行、浪费内存,甚至引发逻辑错误。真正高效的拷贝不是“能用就行”,而是要兼顾速度、简洁性和场景适配性。核心原则是:小数组重可读性,大数组拼底层效率,动态操作看灵活性。
System.arraycopy:大数组拷贝的首选
这是 JVM 内置的 native 方法,直接调用底层内存复制指令,不经过 Java 字节码解释器,性能碾压手动循环。尤其当数组长度超过 1000 元素时,差距明显。
- 必须提前创建目标数组(如 int[] dest = new int[src.length]),否则会抛 NullPointerException
- 支持任意偏移与截取:比如从源数组索引 2 开始拷 5 个元素,到目标数组索引 0 处 —— System.arraycopy(src, 2, dest, 0, 5)
- 适用于需要复用已有数组空间、避免频繁 GC 的场景(如滑动窗口、多轮模拟)
Arrays.copyOf:写法最简,适合完整复制或扩容
一行代码搞定,内部其实也是调用 System.arraycopy,但帮你自动新建数组,省去初始化步骤。竞赛中高频用于“备份当前状态”或“扩大数组容量”。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 拷贝完整数组:int[] copy = Arrays.copyOf(arr, arr.length)
- 扩容常用写法:arr = Arrays.copyOf(arr, arr.length * 2),超出部分按类型默认值填充(int 填 0,Object 填 null)
- 不支持部分拷贝;若只想要前 3 个元素,得用 Arrays.copyOfRange(arr, 0, 3)
clone():轻量完整拷贝,一招鲜够用
原生数组的 clone() 是浅拷贝,但对基本类型数组完全安全,且语法极简。适合快速生成一份独立副本,避免后续修改污染原数据。
立即学习“Java免费学习笔记(深入)”;
- 无需 import,无额外参数:int[] copy = arr.clone()
- 返回类型是 Object,但编译器会自动推导为对应数组类型(JDK 5+)
- 注意:对二维数组(如 int[][])只拷贝外层数组引用,内层数组仍共享 —— 此时需手动深拷贝
别踩坑:这些“伪拷贝”在竞赛中很危险
直接赋值 int[] b = a 不是拷贝,只是起别名,改 b 就等于改 a;for 循环虽直观,但在大数据量下性能落后 30%–50%,且易写错边界(如 i
- 误用引用赋值导致状态污染:比如 BFS 中保存某一层节点,却反复复用同一数组变量
- 忽略数组类型默认值:用 Arrays.copyOf 扩容后未显式初始化新增位置,后续逻辑依赖非零值而失败
- 混淆 copyOf 和 copyOfRange:后者左闭右开,copyOfRange(arr, 1, 4) 拷的是索引 1、2、3 三个元素

















