ホームページ  >  記事  >  Java  >  Javaの「浅いコピー」と「深いコピー」の違いと実装(コード付き)

Javaの「浅いコピー」と「深いコピー」の違いと実装(コード付き)

angryTom
angryTom転載
2019-11-26 15:53:102038ブラウズ

Javaの「浅いコピー」と「深いコピー」の違いと実装(コード付き)

あるオブジェクトの参照を別のオブジェクトにコピーするには、3 つの方法があります。 1 つ目は直接割り当て、2 つ目はシャロー コピー、3 つ目はディープ コピーです。

1. 直接割り当て

Java では、A a1 = a2 となり、これは実際に参照をコピーします。つまり、a1 と a2 は次のポイントを指します。同じオブジェクトです。したがって、a1 が変更されると、a2 のメンバー変数も変更されます。

2. 浅いコピー (参照をコピーしますが、参照されるオブジェクトはコピーしません)

浅いコピー。浅いコピーとも呼ばれます。新しいオブジェクトを作成し、現在のオブジェクトの非静的フィールドを新しいオブジェクトにコピーします。フィールドが値型の場合は、フィールドをコピーします。フィールドが参照型の場合は、参照をコピーしますが、参照されるフィールドはコピーしません。物体。したがって、元のオブジェクトとそのコピーは同じオブジェクトを参照します。

(推奨ビデオ: java ビデオ チュートリアル )

class Resume implements Cloneable{ 
     public Object clone() { 
         try { 
             return (Resume)super.clone(); 
         } catch (Exception e) { 
             e.printStackTrace(); 
         return null; 
         } 
     } 
}

3. ディープ コピー (オブジェクトとその参照オブジェクトをコピー)

ディープ コピーとも呼ばれ、オブジェクト自体をコピーするだけでなく、オブジェクトに含まれる参照が指すすべてのオブジェクトもコピーします。

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;
     }
}

clone() メソッドを使用してオブジェクトのクローンを作成する手順:

1) クローン作成されたクラスは、Cloneable インターフェイスを実装する必要があります。

2) クローン化されたクラスは clone() メソッドをオーバーライドする必要があります。

それでは、プログラミング時に使用するコピー方法をどのように選択すればよいのでしょうか?まず、クラスで非基本型 (つまり、オブジェクト) のデータ メンバーがチェックされます。そうでない場合は、super.clone() を返します。その場合は、クラスに含まれるすべての非基本型メンバー変数がディープ コピーを実装していることを確認してください。

拡張: 浅いコピーと深いコピーの違いは何ですか?

浅いクローン: コピーされたオブジェクトのすべての変数には元のオブジェクトと同じ値が含まれており、他のすべてのオブジェクトへの参照は引き続き元のオブジェクトを指します。つまり、浅いコピーは、参照しているオブジェクトではなく、問題のオブジェクトのみをコピーします。

ディープ クローン: コピーされたオブジェクトのすべての変数には、他のオブジェクトを参照する変数を除き、元のオブジェクトと同じ値が含まれます。他のオブジェクトを参照する変数は、元の参照オブジェクトではなく、コピーされる新しいオブジェクトを指します。つまり、ディープ コピーは、コピーされたオブジェクトによって参照されるすべてのオブジェクトをコピーします。

拡張機能:

プロトタイプ モードは主にオブジェクトのコピーに使用され、インターフェイスを実装し (Cloneable インターフェイスを実装)、メソッドをオーバーライドします (オブジェクト内のクローンをオーバーライドします)。 class()メソッド)、つまりプロトタイプモードが完了します。

プロトタイプ モードでのコピーは、「浅いコピー」と「深いコピー」に分かれています。

浅いコピー: 値型のメンバー変数の値をコピーします。参照型のメンバー変数は参照のみをコピーし、参照されるオブジェクトはコピーしません。

Copy: 値型のメンバ変数の値をコピーし、参照型のメンバ変数の参照オブジェクトをコピーします。

(Object クラスの clone メソッドは、オブジェクト内の基本データ型の値のみをコピーします。配列、コンテナ オブジェクト、参照オブジェクトなどはコピーされません。これは浅いコピーです。ディープ コピーを実装するには、プロトタイプ モードで配列、コンテナ オブジェクト、参照オブジェクトなどを個別にコピーする必要があります。)

プロトタイプ モードの利点:

1.新しいオブジェクトの作成がより複雑な場合は、プロトタイプ パターンを使用してオブジェクトの作成プロセスを簡素化できます。

2. Object クラスの clone メソッドはローカル メソッドであり、バイナリ ストリームを直接操作するため、常にオブジェクトを作成するモードであり、オブジェクトを直接新規作成するよりもパフォーマンスがはるかに優れています。メモリ、特に大規模なコピー オブジェクトを使用する場合、パフォーマンスの違いは非常に明白です。

プロトタイプ パターンの使用シナリオ:

上記の利点があるため、同様のオブジェクトを繰り返し作成する必要がある場合は、プロトタイプ パターンの使用を検討できます。 。たとえば、ループ内でオブジェクトを作成する必要がある場合、オブジェクト作成プロセスが複雑であるかループが多い場合、プロトタイプ パターンを使用すると、作成プロセスが簡素化されるだけでなく、システム全体のパフォーマンスも大幅に向上します。

この記事は、php 中国語 Web サイトの java チュートリアル 列からのものです。学習へようこそ!

以上がJavaの「浅いコピー」と「深いコピー」の違いと実装(コード付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。