Java数组拷贝需按场景选方法:完整拷贝用Arrays.copyOf(),截取或定位用System.arraycopy(),区间复制用Arrays.copyOfRange(),极简完整拷贝可用clone(),但注意浅拷贝问题;手动循环仅适用于边拷贝边转换。

Java 数组拷贝不是“复制一下就行”,关键在选对方法——它直接关系到性能、安全性和可维护性。用错方式,轻则多写几行、填一堆默认值,重则对象被意外修改、多线程下数据错乱。
按场景选方法:完整拷贝优先用 Arrays.copyOf()
日常开发中最多见的需求就是“原样复制一份”或“扩容后保留原内容”。这时 Arrays.copyOf() 最省心:
- 自动创建新数组,不用手动 new,代码干净
- 传入目标长度即可:比原数组长,后面补默认值(int 补 0,String 补 null);比原数组短,只取前 N 个
- 底层调用 System.arraycopy(),性能有保障
- 适合初始化副本、防御性返回、DTO 转换前的数组准备
要截取一段或贴到指定位置?用 System.arraycopy()
这是 JVM 提供的 native 方法,速度最快,但需要你亲手准备目标数组:
- 支持任意起始偏移和长度,比如把 src[2]~src[4] 拷到 dest[5] 开始的位置
- 可用于平移、覆盖、拼接等底层操作(如实现 ring buffer、滑动窗口)
- 参数顺序易错:src, srcPos, dest, destPos, length —— 建议封装成工具方法复用
- 类型必须严格匹配,否则运行时报 ArrayStoreException
明确要某段区间?Arrays.copyOfRange() 更安全直观
语义清晰,“左闭右开”符合 Java 习惯,不用自己算长度:
立即学习“Java免费学习笔记(深入)”;
- copyOfRange(arr, 10, 20) 直接取索引 10 到 19 的 10 个元素,自动建好长度为 10 的新数组
- to 可以超过原数组长度,空位自动补默认值,避免越界异常
- 常用于分页、日志切片、协议解析中的字段提取
- 不支持错位写入,但比手算 + copyOf 更少出错
追求极简完整拷贝?clone() 一行搞定,但注意边界
数组原生支持 clone(),语法最短:
- int[] copy = original.clone(); —— 不用转型(基本类型数组),引用类型需强制转
- 仅支持完整拷贝,不能指定范围或长度
- 对对象数组仍是浅拷贝:新数组里存的是原对象引用,改属性会影响原数组
- 二维数组 clone() 只拷第一层,第二层仍共享;真要深拷贝得配合循环或序列化
手动 for 循环不是首选,只在需要边拷贝边转换时才用——比如过滤负数、转大小写、单位换算。它灵活但易错、性能低,小数据量可接受,大数据量慎用。


















