ディープコピー(deep copy)とは
ディープコピー(deep copy)とは深い(deep)コピーと呼ばれ、コピー元オブジェクトから実体(データ)を複製し別オブジェクトを生成する方式です。
オブジェクト(データを格納する箱※Beanクラス)はメモリ上にある実体(データ)を参照しています。

このオブジェクトに対して「ディープコピー」を行うと、コピーされたもう一つの「コピー先オブジェクト」が生成されます。
この時、メモリ上にある実体(データ)もコピーされます。これが「ディープコピー」です。
「ディープコピー」で作られた2つのオブジェクトは、まったく別の実体(データ)を参照しているため、どちらかのオブジェクトを変更しても、もう片方のオブジェクトには影響を与えません。
スポンサーリンク
ディープコピーの具体例
オブジェクト(データを入れる箱)
以下のクラスが存在するとします。Javaが提供しているclone(複製)を作るインタフェースである「Cloneable」をimplements しています。
package entity;
public class User2 implements Cloneable {
private String name;
@Override
public User2 clone() {
User2 user2 = null;
try {
user2 = (User2) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return user2;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
ディープコピーの実行例
package main;
import entity.User2;
public class Start2 {
public static void main(String[] args) {
User2 user2 = new User2();
// user1の名前を設定
user2.setName("変更前の名前");
// ディープコピー
User2 copyUser2 = user2.clone();
// user2の名前を変更
copyUser2.setName("変更後の名前");
System.out.println("コピー元の名前:" + user2.getName());
System.out.println("コピー先の名前:" + copyUser2.getName());
}
}
上記の例では「user2」のオブジェクトを「copyUser2 」にディープコピーしています。
「user2」と「copyUser2 」のnameフィールドには以下の値を設定。
- 「user2」のnameフィールドに"変更名前の名前"を設定
- 「copyUser2 」のnameフィールドに"変更後の名前"を設定
そして実行結果は以下です。
コピー元の名前:変更前の名前 コピー先の名前:変更後の名前
ディープコピーはシャローコピーとは違い、オブジェクトだけでなく、実体(データ)もコピーする完全なコピーのため、どちらかのオブジェクトを変更しても、もう片方のオブジェクトには影響を与えません。
helpful
この記事は役に立ちましたか?

