Java深拷贝与浅拷贝的区别与运用技巧揭秘

在Java编程中,对象的复制是一个常见的操作。而对象复制的方式主要有两种:深拷贝和浅拷贝。这两种复制方式在内存占用、性能以及应用场景等方面有着明显的区别。本文将深入分析Java深拷贝与浅拷贝的区别,并提供一些实用的运用技巧。
一、什么是深拷贝和浅拷贝?
1. 深拷贝
深拷贝是指复制一个对象时,不仅复制对象本身,还包括对象所引用的所有对象。也就是说,深拷贝会创建一个新的对象,并且将原对象中的所有属性复制到新对象中,包括那些引用类型的属性。
2. 浅拷贝
浅拷贝是指复制一个对象时,只复制对象本身,而不复制对象所引用的所有对象。也就是说,浅拷贝会创建一个新的对象,并将原对象中的属性复制到新对象中,但对于引用类型的属性,新对象和原对象所引用的是同一个对象。
二、深拷贝与浅拷贝的区别
1. 内存占用
深拷贝会创建新的对象和属性,因此内存占用较大。而浅拷贝只复制对象本身,内存占用相对较小。
2. 性能
深拷贝由于需要复制更多的数据,因此性能相对较低。而浅拷贝只复制对象本身,性能较高。
3. 应用场景
深拷贝适用于需要完全独立复制对象的情况下,如对象的修改不会影响到其他对象。浅拷贝适用于对象的修改只会影响到自身,不会影响到其他对象。
三、Java实现深拷贝和浅拷贝的方法
1. 深拷贝
(1)通过序列化与反序列化实现
```java
public class DeepClone implements Cloneable {
private int id;
private String name;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
public static void main(String[] args) throws Exception {
DeepClone obj1 = new DeepClone();
obj1.setId(1);
obj1.setName("obj1");
DeepClone obj2 = (DeepClone) obj1.clone();
System.out.println("obj1 id: " + obj1.getId() + ", obj2 id: " + obj2.getId());
System.out.println("obj1 name: " + obj1.getName() + ", obj2 name: " + obj2.getName());
}
}
```
(2)通过复制构造函数实现
```java
public class DeepClone {
private int id;
private String name;
public DeepClone(DeepClone obj) {
this.id = obj.id;
this.name = obj.name;
}
public static void main(String[] args) {
DeepClone obj1 = new DeepClone();
obj1.setId(1);
obj1.setName("obj1");
DeepClone obj2 = new DeepClone(obj1);
System.out.println("obj1 id: " + obj1.getId() + ", obj2 id: " + obj2.getId());
System.out.println("obj1 name: " + obj1.getName() + ", obj2 name: " + obj2.getName());
}
}
```
2. 浅拷贝
(1)通过重写clone()方法实现
```java
public class ShallowClone implements Cloneable {
private int id;
private String name;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
public static void main(String[] args) throws Exception {
ShallowClone obj1 = new ShallowClone();
obj1.setId(1);
obj1.setName("obj1");
ShallowClone obj2 = (ShallowClone) obj1.clone();
System.out.println("obj1 id: " + obj1.getId() + ", obj2 id: " + obj2.getId());
System.out.println("obj1 name: " + obj1.getName() + ", obj2 name: " + obj2.getName());
}
}
```
(2)通过赋值实现
```java
public class ShallowClone {
private int id;
private String name;
public void setShallowClone(ShallowClone obj) {
this.id = obj.id;
this.name = obj.name;
}
public static void main(String[] args) {
ShallowClone obj1 = new ShallowClone();
obj1.setId(1);
obj1.setName("obj1");
ShallowClone obj2 = new ShallowClone();
obj2.setShallowClone(obj1);
System.out.println("obj1 id: " + obj1.getId() + ", obj2 id: " + obj2.getId());
System.out.println("obj1 name: " + obj1.getName() + ", obj2 name: " + obj2.getName());
}
}
```
四、总结
在Java编程中,深拷贝和浅拷贝是两种常见的对象复制方式。了解它们的区别和运用技巧对于提高代码质量和性能具有重要意义。在实际开发过程中,应根据具体需求选择合适的复制方式,以达到最佳效果。





