在Java中,深拷贝和浅拷贝是用于对象复制的两种重要策略,它们之间的区别主要在于复制的深度和对象的引用关系处理上。同时,引用拷贝也是与这两者相关的概念。以下是对这三种拷贝方式的详细解释:
深拷贝(Deep Copy)
-
定义:深拷贝是指创建一个新对象,并递归地复制原始对象及其所有引用的对象。对于引用类型字段,深拷贝会创建一个新的对象,并复制原对象中引用类型字段所指向的对象到新对象中。
-
特点:
- 原始对象和拷贝对象是完全独立的,它们有不同的内存地址。
- 拷贝对象中的所有属性(包括嵌套对象)都是原始对象对应属性的副本。
- 对拷贝对象的修改不会影响到原始对象。
浅拷贝(Shallow Copy)
-
定义:浅拷贝是指创建一个新对象,并将原始对象的基本数据类型字段值和引用类型字段的内存地址(即引用)复制给新对象。对于引用类型字段,浅拷贝不会复制对象本身,而是只复制了引用的地址。
-
特点:
- 原始对象和拷贝对象在内存中有不同的地址,但它们的某些属性(特别是引用类型的属性)可能指向相同的内存地址。
- 对于不可变数据类型(如基本数据类型和String),浅拷贝和深拷贝的效果是相同的,因为这些类型的值是不可变的。
- 对于可变数据类型(如数组、集合、自定义对象等),浅拷贝只复制了引用,而没有复制引用的对象本身。因此,修改拷贝对象的嵌套对象会影响到原始对象中的对应对象。
引用拷贝(Reference Copy)
-
定义:引用拷贝在Java中实际上是通过赋值操作符“=”实现的,它直接复制对象的引用,使得多个引用指向同一个对象。
-
特点:
- 多个引用指向同一个对象,它们共享同一块内存空间。
- 对其中一个引用指向的对象进行修改,会影响到所有指向该对象的引用
总结
- 深拷贝:创建一个新对象,并递归地复制原始对象及其所有引用的对象。原始对象和拷贝对象是完全独立的。
- 浅拷贝:创建一个新对象,并复制原始对象的基本数据类型字段值和引用类型字段的内存地址。原始对象和拷贝对象可能共享对同一个引用类型对象的引用。
- 引用拷贝:直接复制对象的引用,使得多个引用指向同一个对象。对其中一个引用的修改会影响到所有指向该对象的引用。