내 연락처 정보
우편메소피아@프로톤메일.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Java의 Deep Copy와 Shallow Copy의 차이점을 설명해주세요.
Java에서 Deep Copy와 Shallow Copy는 객체를 복사할 때의 동작이 본질적으로 다릅니다.
얕은 복사는 새 개체를 만든 다음 현재 개체의 비정적 필드를 새 개체에 복사하는 것을 의미하며, 필드가 참조 유형이면 필드가 비트 단위로 복사됩니다. 참조는 복사되지만 참조된 개체는 복사되지 않습니다. 따라서 원본 개체와 해당 복사본은 동일한 개체를 참조합니다.
Java에서는 다음을 통해 이를 달성할 수 있습니다.Cloneable
인터페이스 및 재작성clone()
얕은 복사본을 구현하는 방법입니다.Object
클래스clone()
이 방법을 사용하면 얕은 복사본을 얻을 수 있습니다.
class Original implements Cloneable { | |
private int[] nums; | |
public Original() { | |
nums = new int[5]; | |
} | |
public void setNums(int[] nums) { | |
this.nums = nums; | |
} | |
public Object clone() throws CloneNotSupportedException { | |
return super.clone(); | |
} | |
} |
이 예에서는nums
참조 유형입니다.만약에Original
객체가 얕은 복사된 다음nums
그리고 원래 개체에서nums
동일한 배열 객체를 가리킬 것입니다.
깊은 복사본은 개체 자체를 복사할 뿐만 아니라 개체에 포함된 모든 참조 유형 멤버 변수를 재귀적으로 복사합니다. 즉, 복사본과 원본 개체는 참조 유형 멤버 변수를 공유하지 않습니다. 한 객체의 멤버 변수를 수정해도 다른 객체에는 영향을 미치지 않습니다.
Java에서 전체 복사를 구현하려면 참조 유형의 모든 멤버 변수가 적절하게 복사되도록 코드를 수동으로 작성해야 하는 경우가 많습니다.
class DeepCopied implements Cloneable { | |
private int[] nums; | |
public DeepCopied() { | |
nums = new int[5]; | |
} | |
public void setNums(int[] nums) { | |
this.nums = nums; | |
} | |
@Override | |
public Object clone() throws CloneNotSupportedException { | |
DeepCopied copied = (DeepCopied) super.clone(); | |
copied.nums = nums.clone(); // 对引用类型的成员变量也进行拷贝 | |
return copied; | |
} | |
} |
이 예에서는nums
배열도 복사되므로 원본 개체와 복사본은 공유되지 않습니다.nums
정렬.
전체 복사 또는 얕은 복사 사용 여부는 특정 애플리케이션 시나리오 및 요구 사항에 따라 다릅니다.
Java의 익명 내부 클래스란 무엇입니까? 적용 시나리오는 무엇입니까?