ホームページ >Java >&#&チュートリアル >Java の浅いコピーと深いコピーの違いは何ですか?

Java の浅いコピーと深いコピーの違いは何ですか?

PHPz
PHPzオリジナル
2024-04-11 12:33:011280ブラウズ

浅いコピーと深いコピーの違い: 浅いコピー: 同じデータを参照するオブジェクトを作成します。コピーを変更すると、元のオブジェクトにも影響します。ディープ コピー: 元のオブジェクトのデータのコピーを含むオブジェクトを作成します。コピーを変更しても元のオブジェクトには影響しません。

Java の浅いコピーと深いコピーの違いは何ですか?

#Java の浅いコピーと深いコピー

はじめに

Java では、浅いコピーと深いコピーの概念を理解することは、オブジェクトの操作にとって重要です。このチュートリアルでは、この 2 つの違いについて詳しく説明し、コード例を使用して説明します。

浅いコピー

    元のオブジェクトの同じ基になるデータを参照する新しいオブジェクトを作成します。
  • 浅いコピーへの変更は元のオブジェクトにも反映され、その逆も同様です。
  • 同じへの参照」原則に従います。

コード例:

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 にも影響します。

ディープ コピー

    元のオブジェクトの基礎となるデータの独立したコピーを持つ新しいオブジェクトを作成します。
  • ディープコピーを変更しても元のオブジェクトには影響しませんし、その逆も同様です。
  • 同じ内容」の原則に従ってください。

コード例:

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 には影響しません。これは、p1 が別の Address オブジェクトを参照しているためです。

ディープ コピーとシャロー コピーをいつ使用するか?

  • 浅いコピー: 浅いコピーは、オブジェクトのコピーの変更に副作用がない場合に実行できます。
  • ディープ コピー: オブジェクトのコピーを変更すると元のオブジェクトに影響を与える可能性がある場合、ディープ コピーを作成する必要があります。

たとえば、オブジェクトをキャッシュするとき、またはオブジェクトを信頼できないコードに渡すときは、必ずディープ コピーを使用してください。

以上がJava の浅いコピーと深いコピーの違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。