赋值、浅拷贝、深拷贝行为不同:赋值仅共享引用;浅拷贝新建数组但引用类型仍共享对象;深拷贝需手动或序列化实现完全独立副本。

Java 中数组复制不是简单“复制一份”就能完事的事——赋值、浅拷贝、深拷贝三者行为完全不同,选错方法轻则数据被意外修改,重则引发多线程安全问题或逻辑错误。
直接赋值只是共享引用
用 = 赋值,比如 int[] b = a;,并不会创建新数组。a 和 b 指向同一块内存地址。改 a[0],b[0] 也会跟着变,因为它们根本就是同一个数组。
- 适用于只读场景,或明确需要两个变量操作同一份数据
- 对基本类型和引用类型都生效,但效果一致:不产生新对象
- 无法用于防御性编程,不能隔离修改影响
浅拷贝能隔离基本类型,但对对象仍共享引用
Arrays.copyOf()、System.arraycopy()、clone() 都属于浅拷贝。它们会新建数组容器,但元素内容是否独立,取决于类型:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 基本类型(int、double 等):每个值被独立复制,修改副本不影响原数组
- 引用类型(String、自定义对象等):只复制引用地址,新旧数组的对应位置仍指向同一个对象
- 例如 Student[] stuCopy = Arrays.copyOf(stus, stus.length); 修改 stuCopy[0].setName("李四"),原 stus[0] 的名字也变成"李四"
深拷贝必须逐层复制对象内容
真正意义上的“完全独立副本”,需确保对象及其内部所有引用对象都被重新创建。Java 原生不提供通用深拷贝 API,常用方式有:
- 手动遍历 + 调用对象的拷贝构造函数或 clone() 方法(要求类实现深拷贝逻辑)
- 序列化反序列化(如 ObjectOutputStream + ObjectInputStream),适合可序列化的类
- 使用第三方库(如 Apache Commons Lang 的 SerializationUtils.clone())
- 注意:二维数组用 Arrays.deepCopy() 仅对一维有效;真正嵌套对象仍需自行处理
按场景选最合适的复制方式
不需要纠结“哪个最好”,而要看你要解决什么问题:
- 快速扩容或完整复制基本类型数组 → 用
Arrays.copyOf(src, newLength) - 高性能部分拷贝(如截取、拼接)→ 用
System.arraycopy(src, sPos, dest, dPos, len) - 代码简洁、语义清晰的完整复制 → 用
arr.clone()(数组自带,返回新数组) - 需要定制逻辑(如过滤、转换、深拷贝对象)→ 手动 for 循环控制每个元素
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










