java数组拷贝分赋值、浅拷贝、深拷贝:赋值仅共享引用;浅拷贝新建数组但引用对象仍共享;深拷贝需手动或序列化实现完全独立副本,选择应匹配具体场景需求。

Java 数组拷贝不是“复制一下”就完事的操作——赋值、浅拷贝、深拷贝三者行为完全不同,选错方式会导致数据被意外修改,甚至引发多线程问题。
直接赋值:只是共享引用,根本不算拷贝
写 int[] b = a; 或 String[] copy = original;,并不会创建新数组。a 和 b 指向同一块内存,改一个,另一个立刻同步变化。
- 适用于只读场景,或明确需要两个变量操作同一份数据
- 对基本类型和引用类型都生效,但效果一致:不产生新对象
- 不能用于防御性编程,无法隔离修改影响
浅拷贝:新建数组容器,但引用仍共享
Arrays.copyOf()、System.arraycopy()、arr.clone() 都属于浅拷贝。它们会分配新内存存放数组本身,但元素内容是否独立,取决于类型:
- 基本类型(int、double 等):每个值被独立复制,修改副本不影响原数组
-
引用类型(String[]、User[] 等):只复制引用地址,新旧数组对应位置仍指向同一个对象
例如:userCopy[0].setName("张三") 会同时改变原数组中 user[0] 的名字 - 注意:String 不可变,所以 String[] 浅拷贝通常安全;但 StringBuilder[] 或自定义可变对象不行
深拷贝:真正独立,需手动或序列化实现
深拷贝要求对象及其内部所有引用对象都被重新创建。Java 原生不提供通用 API,必须主动处理:
-
手动遍历 + 构造新对象:最可控,适合结构清晰的类
如:new User(src[i].getName(), src[i].getAge()) - 重写 clone() 并递归深拷贝字段:要求类实现 Cloneable,且每个引用字段也支持深拷贝
- 序列化反序列化:适合可序列化的简单类,但性能低、有局限(不可序列化资源会失败)
- 注意:Arrays.deepCopy() 只对一维数组有效;二维数组或嵌套对象仍需自行处理
按需求选方法,不追求“最先进”
关键不是哪个技术更高级,而是匹配当前场景:
- 快速扩容或复制基本类型数组 → Arrays.copyOf(arr, newLength)
- 高性能截取/拼接(如 IO 缓冲区处理)→ System.arraycopy()
- 代码简洁、语义明确的完整复制 → arr.clone()(类型安全,返回同类型数组)
- 含可变引用对象,且需完全隔离 → 必须手动深拷贝,避免依赖序列化
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











