核心看嵌套引用类型是否真正断开连接:浅拷贝仅复制第一层,引用类型共享堆内存地址;深拷贝递归复制所有层级,在堆中创建完全独立的数据副本。

区分浅拷贝与深拷贝,核心看嵌套的引用类型是否真正“断开连接”——即修改新对象的深层属性时,原对象会不会跟着变。
看内存中是否共享堆地址
引用类型(如对象、数组)的变量名存在栈中,实际数据存在堆中;栈里只存一个指向堆的地址。
- 浅拷贝:只复制第一层属性值。基本类型值被真复制;引用类型值只复制地址指针 → 新旧对象的嵌套子对象仍指向同一块堆内存
- 深拷贝:递归遍历每一层,遇到对象或数组就在堆中新开辟空间,完整重建整个结构 → 新旧对象在堆中有各自独立的数据副本
用修改嵌套属性来验证
这是最直接、无需工具的判断方式:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 写一个含嵌套对象的源数据:const a = { x: 1, y: { z: 2 } };
- 执行拷贝操作得到 b
- 修改 b.y.z = 99
- 检查 a.y.z:若输出 99,说明是浅拷贝;若仍是 2,则是深拷贝
常见方法对应关系要记清
不是所有“看起来像复制”的操作都是深拷贝:
- 浅拷贝典型: Object.assign({}, obj)、[...arr]、arr.slice()、Array.from(arr)
- 所谓“深拷贝”但有严重缺陷:JSON.parse(JSON.stringify(obj)) —— 会丢 undefined、function、Symbol、Date、RegExp、Map、Set、循环引用 等
- 较可靠深拷贝:structuredClone(obj)(现代浏览器支持,不支持函数和某些内置类)、_.cloneDeep(obj)(Lodash,覆盖全面)
本质区别一句话
浅拷贝让新旧对象共享堆内存中的子对象;深拷贝确保所有层级的对象都在堆中拥有专属副本。判断依据不在语法多简短,而在堆里有没有两份独立分配的数据。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










