blog

ディープコピーとシャローコピー

シャローコピー 基本型 コピーは基本型の値 参照型 コピーはメモリアドレスなので、片方のオブジェクトがこのアドレスを変更すると、もう片方にも影響します 実装方法 Cloneableインタフェースを実装...

Nov 13, 2023 · 2 min. read

浅いコピー

プリミティブ型

プリミティブ型の値がコピーされます

参照型

メモリアドレスがコピーされるため、一方のオブジェクトがアドレスを変更すると、もう一方のオブジェクトにも影響が及びます

実装方法

  1. このクラスオブジェクトがコピー可能であることを示すために、Cloneable インターフェースを実装します。
  2. clone() メソッドをオーバーライドして、clone メソッドの例外を捕捉します。

コード例

public class CopyTest {
 public static void main(String[] args) {
 Person p1 = new Person(" , 2, new Car(120));
 Person p2;
 
 // 
 p2 = p1.clone();
 }
}
class Person implements Cloneable {
 private String name;
 private int age;
 // 対応するコンストラクタ、ゲッター、セッター・メソッドを省略する。
 @Override
 protected Person clone() {
 Person person = null;
 
 try {
 person = (Person) (super.clone());
 } catch (CloneNotSupportedException e) {
 
 }
 
 return person;
 }
}

対応するコンストラクタ、ゲッター、セッターのメソッドは省略します。

@Override

protected Person clone() {

Person person = null;

try {

person = (Person) (super.clone());

} catch (CloneNotSupportedException e) {

}

return person;

}

}

Deep copy

Basic types

コピーされた値はプリミティブ型です。

参照型

ディープコピーは新しいオブジェクトスペースを作成し、その内容をコピーします。そのため、異なるメモリスペースを指します。一方を変更しても、もう一方には影響しません。

実装方法

Apache Commons Lang 3ライブラリのSerializationUtilsクラス、

  • Google Guava ライブラリの Copier クラス。
  • コード例

    import org.apache.commons.lang3.SerializationUtils;
    public class DeepCopyExample {
     public static void main(String[] args) {
     // オブジェクトのディープコピーを作る
     Person person = new Person(" , 25);
     // ディープコピーを実行する
     Person copiedPerson = SerializationUtils.deepCopy(person);
     // 元のオブジェクトの名前を変更する
     person.setName("リ・シ");
     // コピー元とコピー先のオブジェクト名を表示する
     System.out.println("元のオブジェクトの名前: "+ person.getName());
     System.out.println("オブジェクトの名前をコピーする: "+ copiedPerson.getName());
     }
     // 名前と年齢の2つの属性を持つPersonクラスを定義する。
     static class Person {
     private String name;
     private int age;
     // 対応するコンストラクタ、ゲッター、セッター・メソッドを省略する。
     }
    }
    
    Read next

    エンドレスチュートリアル - Redis - データ型

    Redisは5つのデータ型をサポートしています。 Redisの文字列はバイト列です。Redisの文字列はバイナリセーフです。

    Nov 3, 2023 · 3 min read