java数组拷贝需据场景选方法:system.arraycopy()性能最优但需手动创建目标数组;arrays.copyof()及copyofrange()简洁常用;clone()最简但仅支持完整浅拷贝;手动循环灵活但性能低易出错。

Java 数组拷贝不是简单“复制一份”就完事,关键在于理解每种方式的底层行为、适用边界和潜在陷阱。选错方法可能导致性能浪费、逻辑错误,甚至在对象数组中引发意外交互。
System.arraycopy():高性能可控拷贝
这是 JVM 提供的 native 方法,直接操作内存,速度最快。它不关心数组类型,只做字节级搬移,因此要求源与目标数组类型兼容(如 int[] → int[]),否则运行时报 ArrayStoreException。
支持任意起始位置与长度,适合部分拷贝、错位覆盖等精细操作:
- 完整拷贝:`System.arraycopy(src, 0, dest, 0, src.length)`
- 截取后三位到新数组开头:`System.arraycopy(src, src.length-3, dest, 0, 3)`
- 向右平移两位(原数组末尾补0):`System.arraycopy(src, 0, dest, 2, src.length)`
注意:目标数组必须提前创建好,且长度不能小于拷贝所需空间,否则抛 IndexOutOfBoundsException。
Arrays.copyOf() 与 copyOfRange():简洁实用的封装
这两个方法本质都调用 System.arraycopy(),但封装了目标数组创建逻辑,省去手动 new 的步骤。
-
Arrays.copyOf(original, newLength):常用于扩容。若
newLength > original.length,多出位置填默认值(int 为 0,引用类型为 null);若更小,则只取前newLength个元素。 -
Arrays.copyOfRange(original, from, to):语义清晰,“左闭右开”。例如
copyOfRange(arr, 1, 4)拷贝索引 1、2、3 三个元素,自动创建长度为 3 的新数组。
二者都不支持错位写入或覆盖式拷贝,但代码更短、不易出错,是日常开发中最常用的选择。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
clone():最简完整拷贝,但有类型限制
所有数组类都继承自 Object,并重写了 clone() 方法,返回一个类型相同、内容相同的新数组。调用只需一行:int[] copy = (int[]) src.clone();
优点是语法极简,且对基本类型数组天然安全;缺点是只能完整拷贝,无法指定范围,也不能用于泛型集合(因为数组不支持泛型擦除后的安全 clone)。
对对象数组,clone() 仍是浅拷贝——新数组里每个元素仍是原对象的引用,修改对象属性会影响原数组。
手动 for 循环:灵活但需谨慎
虽然原始,却是唯一能自然嵌入转换逻辑的方式。比如拷贝时过滤负数、转大写、做单位换算等:
- 拷贝同时做数据清洗:
if (src[i] > 0) dest[j++] = src[i]; - 对象数组深拷贝:
dest[i] = new Person(src[i].getName());
性能不如系统级方法,小数据量无感,大数据量应避免。循环变量越界、数组长度不一致等低级错误也较常见,建议仅在有定制需求时采用。
不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










