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

为什么复制对象?浅拷贝和深拷贝有什么区别?

查看完整题解

参考回答

直接回答

复制对象常用于生成快照、隔离修改或保存独立状态。浅拷贝复制对象本身的字段值,引用字段仍指向原有内部对象;深拷贝则按需求继续复制内部可变对象,让需要隔离的部分独立。把一个引用赋给另一个变量,连浅拷贝都不算。

讲清原理

Object.clone 通常按字段复制:基本值被复制,引用值也被复制,但引用指向的对象并未自动复制。使用这套机制时还涉及 Cloneable 约定和访问控制,不能对任何对象都直接调用 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,不能把这个小例子直接当成任意对象图的通用实现。

相关题:第 21 题、第 34 题、第 45 题。

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

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