Java数组拷贝技术自1.0起核心机制稳定,clone()提供原生浅拷贝,System.arraycopy()为JVM级高性能支柱,Arrays.copyOf()系列是Java 6引入的易用封装,Stream API仅适用于需转换逻辑的场景。

Java 数组拷贝技术从 Java 1.0 到 Java 21 并未引入全新机制,而是围绕几个核心方法持续优化、封装和泛化。真正稳定且被广泛依赖的拷贝能力,在 Java 1.0 就已存在(如 clone()),后续版本主要在易用性、类型安全和开发体验上做增强,而非底层逻辑重构。
clone():最原始但需谨慎使用的深拷贝入口
自 Java 1.0 起,所有数组类型都隐式继承自 Object,并重写了 clone() 方法——这是 JVM 对数组提供的原生支持。它执行的是浅拷贝(对基本类型等效于深拷贝;对引用类型只复制引用)。
- 调用简单:
int[] copy = (int[]) original.clone(); - 无需预分配目标数组,返回新数组
- 不抛
CloneNotSupportedException(数组类型自动支持) - 注意:二维及以上数组需逐层 clone,否则仍是浅拷贝
System.arraycopy():JVM 级性能支柱(Java 1.0 就有)
这个 native 方法从 Java 最初版本就存在,至今仍是高性能拷贝的黄金标准。它绕过 Java 层循环,直接操作内存块,适合大数组或关键路径。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 语法明确但参数多:
System.arraycopy(src, srcPos, dest, destPos, len) - 支持跨数组任意区域拷贝(包括重叠拷贝,类似 C 的
memmove) - 运行时检查类型兼容性,不匹配会抛
ArrayStoreException - Java 21 中仍无替代者,HotSpot 对其做了多年深度优化
Arrays.copyOf() 和 copyOfRange():Java 1.6 引入的高级封装
为降低 arraycopy 使用门槛,Java 6 增加了 java.util.Arrays 中的一系列静态工厂方法。它们内部仍调用 arraycopy,但隐藏细节、提升可读性。
立即学习“Java免费学习笔记(深入)”;
-
Arrays.copyOf(arr, newLength):自动创建新数组,支持扩容/截断 -
Arrays.copyOfRange(arr, from, to):语义清晰,to是 exclusive(类似 Python 切片) - 泛型重载丰富(
int[]、String[]、T[]全覆盖) - Java 8+ 后成为日常开发首选,简洁且不易出错
Stream API 与现代辅助(Java 8 及以后)
Java 8 引入 Stream 并不专为数组设计,但可通过 Arrays.stream() + toArray() 实现函数式风格拷贝(尤其配合映射、过滤等):
int[] copy = Arrays.stream(original).toArray();- 本质是先转流再收集,性能远低于
arraycopy或copyOf - 适用于需要转换逻辑的场景(如“拷贝并乘2”),非纯复制任务中才有价值
- Java 17+ 的模式匹配、record 等特性未新增数组拷贝能力,但可简化封装逻辑

















