Javaでオブジェクトをコピーするにはどうすればよいですか?

⭐コラム紹介

このコラムでは、面接での質問やJAVAの習熟度の紹介など、JAVAに関するさまざまな疑問を随時更新していきます。

更新スピードは1日あたり3〜5記事を維持します

ここに画像の説明を挿入します

Javaでオブジェクトをコピーするにはどうすればよいですか?

Java 言語では、オブジェクトをコピーする必要がある場合、次の 2 種類のコピーがあります。 浅いコピー

ディープコピー付き。浅いコピーはソース オブジェクトのアドレスのみをコピーするため、ソース オブジェクトの値が変更されたとき

、コピーされたオブジェクトの値も変更されます。ディープコピーはソースオブジェクトのすべての値をコピーするため、

コピー元のオブジェクトの値が変わっても、コピーされたオブジェクトの値は変わりません。

ここに画像の説明を挿入します

1. 浅いコピー clone()

Java におけるオブジェクトのコピーとは、オブジェクトのすべてのプロパティ (メンバー変数) を同じクラス型の別のオブジェクトにコピーすることを指します。

例: オブジェクト A とオブジェクト B は両方ともクラス S に属し、属性 a と b を持ちます。次に、オブジェクト A をコピーしてオブジェクト B に割り当てます。

あれは:

B.b = A.a;
B.b = A.a;

データ型が基本データ型であるメンバー変数の場合、浅いコピーは値を直接転送します。つまり、属性を新しいオブジェクトにコピーします。これらは 2 つの異なるデータであるため、一方のオブジェクトのメンバー変数値を変更しても、もう一方のオブジェクトによってコピーされたデータには影響しません。
データ型が参照型であるメンバー変数の場合、たとえば、メンバー変数が配列や特定のクラスのオブジェクトなどである場合、浅いコピーは参照を転送します。つまり、参照ポインターのみをコピーします (メンバー変数のメモリアドレス) を新しいオブジェクトに追加します。実際には、両方のオブジェクトのメンバー変数が同じインスタンスを指しているためです。この場合、あるオブジェクトのメンバー変数を変更すると、別のオブジェクトのメンバー変数の値に影響します。

2.ディープコピー

オブジェクトのすべての基本データ型のメンバー変数値をコピーする必要があるだけでなく、参照データ型のすべてのメンバー変数の記憶領域を申請し、各参照データによって参照されるオブジェクトをコピーする必要もありますオブジェクトが到達可能なすべてのオブジェクトがわかるまで、type メンバー変数を使用してください。つまり、オブジェクトのディープ コピーでは、オブジェクト グラフ全体をコピーする必要があります。簡単に言うと、ディープ コピーは、データ型のメンバー変数を参照するオブジェクト グラフ内のすべてのオブジェクトのメモリ領域を開きます。一方、シャロー コピーは、データ型のメンバー変数を転送するだけです。新しいオブジェクトは、参照データ型用のメモリ空間を作成しません。

3. シリアル化されたクローン作成 (ディープ コピー)

シリアル化とは、オブジェクトをストリームに書き込むプロセスです。ストリームに書き込まれるオブジェクトは元のオブジェクトのコピーであり、元のオブジェクトはメモリ内にまだ存在します。シリアル化によるコピーでは、オブジェクト自体をコピーするだけでなく、そのオブジェクトが参照するメンバオブジェクトもコピーできるため、オブジェクトをシリアル化してストリームに書き込み、ストリームから読み出すことでディープコピーを実現できます。シリアル化されたオブジェクトのクラスは Serializable インターフェイスを実装する必要があり、そうでない場合はシリアル化操作を実装できないことに注意してください。

おすすめ

転載: blog.csdn.net/weixin_50843918/article/details/132889914