一维数组拷贝的本质是内存分离,即创建独立堆空间避免相互影响;直接赋值仅为引用复制,属浅拷贝;基本类型数组天然具深拷贝效果,引用类型数组仅数组层级深、元素层级浅。

一维数组拷贝的本质是内存分离
Java中所谓“拷贝数组”,核心目标是让新数组拥有独立内存空间,避免修改一个影响另一个。直接赋值(int[] b = a;)只是复制引用,两个变量指向同一块堆内存,属于浅拷贝,不满足真正意义上的拷贝需求。一维基本类型数组(如 int[]、double[])的拷贝天然倾向深拷贝效果;而一维引用类型数组(如 String[]、Object[])则需注意:数组本身被复制了,但其中每个元素仍指向原对象——即数组层级是深的,元素层级仍是浅的。
System.arraycopy():性能最优,适合精确控制
这是JVM底层实现的native方法,执行效率最高,适用于对性能敏感或需要部分拷贝的场景。
- 语法:
System.arraycopy(src, srcPos, dest, destPos, length) - 要求目标数组必须预先创建且类型兼容,否则抛
ArrayStoreException - 支持跨数组拷贝(比如从src第2位拷到dest第0位)、长度截断或越界检查(越界会抛
IndexOutOfBoundsException) - 对基本类型和引用类型均适用,拷贝后数组独立,修改互不影响
Arrays.copyOf():最常用,兼顾简洁与扩容能力
封装了 System.arraycopy(),调用更直观,还支持自动扩容或截断。
- 语法:
Arrays.copyOf(original, newLength) - 若
newLength > original.length,末尾用默认值填充(int填0,Object填null) - 若
newLength ,只取前 <code>newLength个元素 - 本质是先新建数组再拷贝,因此结果数组与原数组完全隔离
clone() 方法:轻量快捷,语义清晰
所有数组都继承自 Object,天然支持 clone()。它返回一个新数组,内容相同,地址不同。
- 语法:
int[] copy = original.clone(); - 无需预分配目标数组,一行搞定
- 对一维基本类型数组,效果等同深拷贝;对一维引用类型数组,数组对象被复制,但元素仍为原引用(即数组层面深,元素层面浅)
- 注意:返回类型是
Object,需强制转型(如String[] arr = ((String[]) original.clone());),泛型数组需额外处理
for 循环手动拷贝:灵活可控,适合定制逻辑
最基础的方式,代码略长但自由度最高,可嵌入过滤、转换、条件判断等业务逻辑。
- 适用于需要按规则拷贝(例如只复制偶数索引、跳过 null 元素、做数值映射等)
- 对基本类型,明确新建数组并逐项赋值,确保内存隔离
- 对引用类型数组,若需真正深拷贝(即连元素对象也复制),必须在循环内调用元素自身的拷贝逻辑(如
element.clone()或构造新对象) - 缺点是易出错(如边界写错)、性能低于原生API,一般非必要不首选
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











