浅拷贝仅复制对象第一层属性,引用类型共享堆内存地址;深拷贝递归复制所有层级,在堆中为每个嵌套对象创建独立副本,新旧对象完全隔离。

区分浅拷贝和深拷贝,关键看堆内存中是否生成了独立的数据副本——不是看代码写了多少行,而是看新旧对象在内存里是不是真的“分开了”。
栈里存什么,决定了拷贝的起点
基本类型(string、number、boolean、null、undefined、symbol、bigint)直接存在栈里,变量名就等于值本身。赋值时复制的是实实在在的数值,天然独立,不涉及深浅问题。
引用类型(object、array、date、regexp、function 等)的变量名也存在栈里,但栈里只存一个地址——指向堆内存中真实数据的指针。这个地址才是拷贝操作真正传递的东西。
浅拷贝:只在栈里配了一把新钥匙
它新建一个对象,把原对象第一层属性的值逐个抄过去:
- 遇到基本类型值(如 name: '张三'),就真复制一份值,放进新对象里;
- 遇到引用类型值(如 address: { city: '杭州' }),只复制那个地址指针,新旧对象的 address 指向堆中同一块内存。
结果是:外层独立,内层共用。改 newObj.address.city,原对象也会变。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
深拷贝:在堆里重新盖一栋楼
它不只是复制第一层,而是顺着每个引用地址一路往下找,每遇到一个对象或数组,就在堆内存中新开辟一块空间,把它的内容(包括内部嵌套的所有层级)完整重建一遍。
最终两个对象:
- 栈里有各自的地址指针;
- 堆里有各自独立的数据副本。
彼此修改互不影响,因为它们根本不在同一个物理位置上。
一句话定位差异
浅拷贝让新旧对象共享堆内存中的子对象;深拷贝确保所有层级的对象都在堆中拥有专属副本。判断依据不是语法,而是打开浏览器开发者工具的 Memory 面板——你能看到两份独立的堆分配,才是真正的深拷贝。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










