共通点:コピー用
違い: ポインタの場合、シャロー コピーはヒープ領域にポインタを追加するだけですが、ディープ コピーは新しいヒープ領域に適用され、追加されたポインタが新しいメモリを指すようにポインタを追加します。ディープ コピーを使用すると、メモリを解放するときに同じヒープ領域が繰り返し解放されません。
ディープコピー
浅いコピー
System.arraycopy は関数のコピーに便利なので、この関数が配列参照の深いコピーか浅いコピーなのか、配列要素の浅いコピーなのか深いコピーなのかを考えています。
直接的に言えば、System.arraycopy を使用して配列をコピーする場合、それは配列参照のディープ コピーであり、一部の種類の配列要素 (基本データ型、ラッパー クラス、文字列) のディープ コピーであり、その他はシャロー コピーです。
次は検証です
新しいテストおよび人物クラスを作成する
説明: p1 p2 p3 は people[] 型、サイズ 10 の配列です。
class People {
public int age = 10;
public String name = "p1";
public char c = '1';
}
浅いコピー
People[] p1 = new People[10];
p1[0] = new People();
People[] p2 = p1;
System.out.println(p1); //People;@7d4991ad
System.out.println(p2); //People;@7d4991ad
System.out.println("******************************************");
System.out.println(p1[0]); //People@28d93b30
System.out.println(p2[0]); //People@28d93b30
System.out.println("******************************************");
深い/浅いコピー
People[] p3 = new People[10];
p3[0] = new People();
System.arraycopy(p3,0,p1,0,p1.length);
System.out.println(p1); //People;@7d4991ad
System.out.println(p3); //People;@1b6d3586
System.out.println("******************************************");
System.out.println(p1[0]); //People@4554617c
System.out.println(p3[0]); //People@4554617c
System.out.println("******************************************");
p3[0].age = 30;
System.out.println(p1[0].age); //30
System.out.println(p3[0].age); //30
p1 = p2 は浅いコピーですが、ここでは明らかに説明されていません。
arraycopy 後の P3 のアドレス値は P1 のアドレス値とは異なり、これが配列参照のディープ コピーであることを示しています。
P3 と P1 の要素はカスタム People タイプです。つまり、P3 と P1 はオブジェクト タイプの配列への参照です。P1 と P3 (People タイプのオブジェクト) の要素は同じアドレスを持ちます。属性を変更するときP3[0] の属性 (age) に応じて、P1[0] の属性 (age) が変化し、浅いコピーであることを示します。
間違いがある場合は、バックグラウンドで修正してください。