目录
1、浅拷贝与深拷贝的区别
浅拷贝
深拷贝
2、浅拷贝实现
3、深拷贝实现
来都来了点个赞收藏一下再走呗~~~🌹🌹🌹🌹🌹
1、浅拷贝与深拷贝的区别
浅拷贝
- 定义:浅拷贝创建了一个新的对象,但是这个新对象的成员变量中引用数据类型仍然指向原对象中相应的成员变量所指向的对象。
- 实现:直接赋值的方式就是浅拷贝。
- 特点
- 浅拷贝是快速的,因为它只是复制了对象的引用。
- 如果原对象的成员变量引用了可变对象,那么在拷贝对象中修改这些成员变量会影响到原对象。
- 浅拷贝对于不可变对象是安全的。
深拷贝
- 定义:深拷贝创建了一个新的对象,并且递归地复制了原对象的所有成员变量,包括引用数据类型指向的对象。
- 实现:可以通过实现Cloneable接口并重写Object类的clone()方法来实现浅拷贝。,通常需要自定义实现,可能涉及到递归拷贝或使用序列化机制。
- 特点:
- 深拷贝是耗时的,因为它需要复制对象及其所有引用的对象。
- 深拷贝创建了一个完全独立的对象副本,修改拷贝对象不会影响原对象。
- 深拷贝对于包含循环引用的对象可能比较复杂。
2、浅拷贝实现
物料类
package clone;public class Student{private String name;private int age;public Student() {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}
Student s1 = new Student();
s1.setName("s1");
s1.setAge(20);
//浅拷贝
Student s2 = s1;
System.out.println(s1);
System.out.println(s2);
s2.setName("s2");
//s1和s2的name都变成s2
System.out.println(s1.getName());
System.out.println(s2.getName());
浅拷贝的结果输出:
由此我们可以看到实际上的浅拷贝就是把引用类型的地址赋值给创建的对象
3、深拷贝实现
这个地方就讲一种最常用的实现深拷贝的方法,就是实现cloneable接口,并且重写其中的clone方法。
物料类
package clone;public class Student implements Cloneable {private String name;private int age;public Student() {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overrideprotected Student clone() throws CloneNotSupportedException {return (Student) super.clone();}
}
//深拷贝
try {Student s2 = s1.clone();System.out.println(s1);System.out.println(s2);s2.setName("s2");System.out.println(s1.getName());System.out.println(s2.getName());
} catch (CloneNotSupportedException e) {throw new RuntimeException(e);
}
我们可以发现深拷贝是重写创建一个引用类型的对象