>  기사  >  Java  >  Java에서 얕은 복사와 깊은 복사의 차이점은 무엇입니까?

Java에서 얕은 복사와 깊은 복사의 차이점은 무엇입니까?

PHPz
PHPz원래의
2024-04-11 12:33:011158검색

얕은 복사와 깊은 복사의 차이점: 얕은 복사: 동일한 데이터를 참조하는 개체를 만들고 복사본을 변경하면 원본 개체에도 영향을 미칩니다. 전체 복사: 원본 개체 데이터의 복사본을 포함하는 개체를 만듭니다. 복사본을 변경해도 원본 개체에는 영향을 주지 않습니다.

Java에서 얕은 복사와 깊은 복사의 차이점은 무엇입니까?

Java의 얕은 복사와 전체 복사

소개

Java에서 얕은 복사와 전체 복사의 개념을 이해하는 것은 객체 작업에 매우 중요합니다. 이 튜토리얼에서는 둘 사이의 차이점을 자세히 설명하고 코드 예제를 통해 설명합니다.

Shallow copy

  • 원본 개체와 동일한 기본 데이터를 참조하는 새 개체를 만듭니다.
  • 얕은 복사본에 대한 모든 변경 사항은 원본 개체에도 반영되며 그 반대의 경우도 마찬가지입니다.
  • "동일 참조" 원칙을 따르세요.

코드 예:

class Person {
    private String name;
    private Address address;
}

public class ShallowCopyDemo {

    public static void main(String[] args) {
        Person p1 = new Person();
        p1.setName("John Doe");
        Address addr = new Address();
        addr.setStreet("123 Main St.");
        p1.setAddress(addr);

        // Shallow copy
        Person p2 = p1;

        // 更改 p2 的地址
        p2.getAddress().setStreet("456 Elm St.");

        // p1 的地址也发生了变化
        System.out.println(p1.getAddress().getStreet()); // 输出:456 Elm St.
    }
}

이 예에서 p2p1의 얕은 복사본이며 동일한 Address 개체를 참조합니다. . 따라서 p2 주소를 변경하면 p1에도 영향을 미칩니다. p2p1 的浅拷贝,它们引用相同的 Address 对象。因此,对 p2 的地址进行更改也会影响 p1

深拷贝

  • 创建一个新对象,该对象拥有原始对象底层数据的独立副本。
  • 更改深拷贝不会影响原始对象,反之亦然。
  • 遵循“内容相同”原则。

代码示例:

使用 clone() 方法或第三方库(如 Apache Commons Lang)来实现深拷贝。

使用 clone() 方法:

class Person implements Cloneable {
    private String name;
    private Address address;

    @Override
    public Person clone() {
        try {
            // 使用 super.clone() 创建新对象
            return (Person) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return null;
    }
}

public class DeepCopyDemo {

    public static void main(String[] args) {
        Person p1 = new Person();
        p1.setName("John Doe");
        Address addr = new Address();
        addr.setStreet("123 Main St.");
        p1.setAddress(addr);

        // Deep copy
        Person p2 = p1.clone();

        // 更改 p2 的地址
        p2.getAddress().setStreet("456 Elm St.");

        // p1 的地址保持不变
        System.out.println(p1.getAddress().getStreet()); // 输出:123 Main St.
    }
}

在此示例中,clone() 方法为 p1 创建了一个深拷贝。更改 p2 的地址不会影响 p1,因为它们引用不同的 Address

Deep copy

    원본 개체의 기본 데이터에 대한 독립적인 복사본을 보유하는 새 개체를 생성합니다.
  • 딥 카피를 변경해도 원본 개체에는 영향을 미치지 않으며 그 반대의 경우도 마찬가지입니다.
  • "
  • 동일한 콘텐츠" 원칙을 따릅니다.

코드 예:

🎜🎜clone() 메서드 또는 타사 라이브러리(예: Apache Commons Lang)를 사용하여 전체 복사를 구현합니다. 🎜🎜🎜clone() 메서드 사용: 🎜🎜rrreee🎜이 예에서 clone() 메서드는 p1의 전체 복사본을 만듭니다. p2의 주소를 변경해도 p1은 다른 Address 개체를 참조하므로 영향을 받지 않습니다. 🎜🎜🎜깊은 복사와 얕은 복사는 언제 사용하나요? 🎜🎜🎜🎜🎜얕은 복사: 🎜객체의 복사본을 수정하는데 부작용이 없을 때 얕은 복사를 할 수 있습니다. 🎜🎜🎜Deep Copy: 🎜원본 개체에 영향을 줄 수 있는 개체의 복사본을 수정할 때 Deep Copy가 필요합니다. 🎜🎜🎜예를 들어, 객체를 캐싱하거나 신뢰할 수 없는 코드에 전달할 때는 항상 전체 복사본을 사용하세요. 🎜

위 내용은 Java에서 얕은 복사와 깊은 복사의 차이점은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.