Java数组复制首选Arrays.copyOf(),它类型安全、自动推断、支持截断扩容;性能敏感时用System.arraycopy()手动控制;clone()仅适用于一维浅拷贝;对象数组深拷贝需遍历克隆或借助序列化。

Java中复制数组内容有多种方式,核心区别在于是浅拷贝还是深拷贝、是否需要类型安全、是否要处理null或边界情况。最常用且推荐的是Arrays.copyOf()和System.arraycopy(),它们高效、简洁、不易出错。
使用 Arrays.copyOf() 快速复制整个或部分数组
这是最常用也最安全的方式,底层调用System.arraycopy(),支持自动推断类型,还能指定新数组长度(可截断或扩容)。
- 复制整个数组:
int[] newArr = Arrays.copyOf(oldArr, oldArr.length); - 只取前3个元素:
int[] head = Arrays.copyOf(arr, 3);(若原数组不足3个,末尾补0) - 复制并扩容:
String[] bigger = Arrays.copyOf(strs, strs.length + 5);(新增位置为null)
用 System.arraycopy() 实现高性能手动控制
适合对性能敏感或需精确控制起始位置、长度的场景,比如实现数组拼接、移动元素等。它不创建新数组,只复制数据,所以必须提前准备好目标数组。
- 语法:
System.arraycopy(src, srcPos, dest, destPos, length); - 示例:把arr[2]到arr[4]复制到newArr索引0开始:
System.arraycopy(arr, 2, newArr, 0, 3); - 注意:src和dest可以是同一个数组,实现“左移”“右移”等操作(但需避免重叠覆盖导致数据错乱)
利用 clone() 方法进行浅拷贝
所有数组类型都继承自Object,天然支持clone()。简单直接,但仅限一维基本类型或不可变对象数组;对含可变对象的数组,只是复制引用,属于浅拷贝。
立即学习“Java免费学习笔记(深入)”;
- 基本类型数组:
int[] copy = arr.clone();—— 安全有效 - 对象数组:
String[] copy = strArr.clone();—— 元素引用相同,内容未隔离 - 不能用于泛型集合,也不适用于多维数组的深度复制
借助 Collections 工具类处理包装类型数组
当数组是Integer[]、String[]等引用类型时,也可转为List再复制,适合逻辑清晰优先于性能的场景。
-
Integer[] copy = list.toArray(new Integer[0]);(先用Arrays.asList()转List) - 注意:
Arrays.asList()返回的List是固定大小的,背后仍引用原数组,直接new ArrayList(...)才能真正解耦 - 这种方式稍重,不推荐高频或大数据量场景
基本上就这些。日常开发优先选Arrays.copyOf(),性能关键或复杂偏移用System.arraycopy(),简单一维数组临时复制可用clone()。深拷贝对象数组需自行遍历+克隆,或借助序列化、第三方库如Apache Commons Lang的SerializationUtils.clone()。










