Java의 딥 카피 (딥 카피) 및 딥 카피 (딥 카피) 소개
얕은 복사본은 객체를 복사할 때 객체 자체(객체의 기본 변수 포함)만 복사하고 객체에 포함된 참조가 가리키는 객체는 복사하지 않습니다.딥 카피는 객체 자체를 복제할 뿐만 아니라 복제 객체에 포함된 참조가 가리키는 모든 객체를 복제합니다.예를 들어 객체 A1에는 B1에 대한 참조가 포함되고 B1에는 C1에 대한 참조가 포함됩니다.얕은 복사본 A1은 A2를 얻었고 A2에는 B1에 대한 인용이 포함되었고 B1에는 C1에 대한 인용이 포함되었다.딥 카피는 얕은 카피에 대한 귀속이다. 딥 카피 A1은 A2를 얻고 A2는 B2(B1의copy)를 인용하며 B2는 C2(C1의copy)를 인용한다.
만약 clone () 방법을 바꾸지 않는다면, 이 방법을 호출하여 얻은 대상은 얕은 복사입니다. 다음은 깊은 복사에 중심을 두겠습니다.
다음 프로그램을 실행하여 간단한 복제본을 확인하십시오.
class Professor0 implements Cloneable {
String name;
int age;
Professor0(String name, int age) {
this.name = name;
this.age = age;
}
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
class Student0 implements Cloneable {
String name;// 。
int age;
Professor0 p;// 1 2 。
Student0(String name, int age, Professor0 p) {
this.name = name;
this.age = age;
this.p = p;
}
public Object clone() {
Student0 o = null;
try {
o = (Student0) super.clone();
} catch (CloneNotSupportedException e) {
System.out.println(e.toString());
}
return o;
}
}
public class ShallowCopy {
public static void main(String[] args) {
Professor0 p = new Professor0("wangwu", 50);
Student0 s1 = new Student0("zhangsan", 18, p);
Student0 s2 = (Student0) s1.clone();
s2.p.name = "lisi";
s2.p.age = 30;
s2.name = "z";
s2.age = 45;
System.out.println(" s1 :" + s1.name + "
s1 :" + s1.p.name + "," + "
s1 " + s1.p.age);// 1
}
}
s2는 변했지만 s1도 변했다. s1의 p와 s2의 p가 같은 대상을 가리키는 것을 증명한다.이것은 우리가 가지고 있는 실제 수요에서 그렇지 않기 때문에 우리는 깊은 복사를 필요로 한다.
class Professor implements Cloneable {
String name;
int age;
Professor(String name, int age) {
this.name = name;
this.age = age;
}
public Object clone() {
Object o = null;
try {
o = super.clone();
} catch (CloneNotSupportedException e) {
System.out.println(e.toString());
}
return o;
}
}
class Student implements Cloneable {
String name;
int age;
Professor p;
Student(String name, int age, Professor p) {
this.name = name;
this.age = age;
this.p = p;
}
public Object clone() {
Student o = null;
try {
o = (Student) super.clone();
} catch (CloneNotSupportedException e) {
System.out.println(e.toString());
}
o.p = (Professor) p.clone();
return o;
}
}
public class DeepCopy {
public static void main(String args[]) {
long t1 = System.currentTimeMillis();
Professor p = new Professor("wangwu", 50);
Student s1 = new Student("zhangsan", 18, p);
Student s2 = (Student) s1.clone();
s2.p.name = "lisi";
s2.p.age = 30;
System.out.println("name=" + s1.p.name + "," + "age=" + s1.p.age);// 1 。
long t2 = System.currentTimeMillis();
System.out.println(t2-t1);
}
}
물론 객체를 직렬화하는 심층 복제 방법도 있습니다.
import java.io.*;
//Serialization is time-consuming
class Professor2 implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
String name;
int age;
Professor2(String name, int age) {
this.name = name;
this.age = age;
}
}
class Student2 implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
String name;// 。
int age;
Professor2 p;// 1 2 。
Student2(String name, int age, Professor2 p) {
this.name = name;
this.age = age;
this.p = p;
}
public Object deepClone() throws IOException, OptionalDataException,
ClassNotFoundException {
//
ByteArrayOutputStream bo = new ByteArrayOutputStream();
ObjectOutputStream oo = new ObjectOutputStream(bo);
oo.writeObject(this);
//
ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
ObjectInputStream oi = new ObjectInputStream(bi);
return (oi.readObject());
}
}
public class DeepCopy2 {
/**
* @param args
*/
public static void main(String[] args) throws OptionalDataException,
IOException, ClassNotFoundException {
long t1 = System.currentTimeMillis();
Professor2 p = new Professor2("wangwu", 50);
Student2 s1 = new Student2("zhangsan", 18, p);
Student2 s2 = (Student2) s1.deepClone();
s2.p.name = "lisi";
s2.p.age = 30;
System.out.println("name=" + s1.p.name + "," + "age=" + s1.p.age); // 1 。
long t2 = System.currentTimeMillis();
System.out.println(t2-t1);
}
}
그러나 직렬화는 시간이 많이 걸린다. 일부 구조에서 우리는 그들이 종종 대상을 직렬화한 후에 전달하는데 시간이 많이 걸린다는 것을 느낄 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자바의 복사 메커니즘을 깊이 이해하다만약 우리new가 새로운 대상을 낸다면, 하나의 성명으로 인용하고, 그 다음에 다른 성명으로 이전 성명을 인용한다면, 마지막 결과는 이 두 성명의 변수는 같은 대상을 가리키며, 한 곳은 모두 수정될 것이다.만약 우리...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.