Java 后端面试题库 / 全部题解免费阅读理解原理,有条理地回答

浅拷贝、深拷贝与引用赋值有什么区别?

查看完整题解

参考回答

直接回答

引用赋值只是让两个变量指向同一个对象,没有创建副本。浅拷贝创建外层副本,但引用字段或容器元素仍可能共享内部对象;深拷贝则按需求继续复制需要隔离的可变对象。深拷贝不是把所有东西无条件复制,必须先明确哪些状态需要独立。

讲清原理

不可变值通常可以安全共享,可变数组或列表则要判断是否继续复制。涉及循环引用和多个字段指向同一子对象时,还要维护正确的对象图关系,否则可能无限递归或意外打散共享关系。

Object.clone 的常见基础行为是按字段复制,不会自动遍历整个对象图。复制构造器和工厂方法常能把业务复制策略表达得更明确;文件句柄、连接等资源一般也不能当普通数据盲目复制。

浅拷贝共享内部对象,深拷贝创建需要隔离的内部副本
浅拷贝共享内部对象,深拷贝创建需要隔离的内部副本

例子与易错点

int[][] source = {{1, 2}};
int[][] shallow = source.clone();
int[][] deep = {source[0].clone()};
source[0][0] = 9;
System.out.println(shallow[0][0]); // 9
System.out.println(deep[0][0]);    // 1

这里只演示一行二维数组。通用实现还需处理全部行、null 和更复杂的元素。用序列化“顺便深拷贝”有类型、安全与语义限制,不应当成任何对象都适用的复制方案。

相关题:第 7 题、第 11 题、第 23 题。

这道题,你掌握得怎么样?

掌握程度由你主动标记,阅读和收藏不会自动改变状态。