2008年12月25日

Javaでオブジェクト(ArrayListなど)のディープコピーを行う

HashMapのArrayListオブジェクトをディープコピーしようとすると、ループ文で1個づつコピーしなければなりませんが、ちょっと面倒です。そこで、ObjectOutputStreamで対象オブジェクトをシリアライズしてバイト配列に変換できることを利用して、ディープコピーするメソッドを紹介します。

/**
* ディープコピーします
* @param obj コピー元オブジェクト
* @return コピーオブジェクト
*/
public static Object deepCopy(Object obj)

これ↑が、ディープコピー用のメソッドです。実装および使用方法は、「ソースコード」に載せています。

「ソースコード」の実行結果は、

src:[{Aitem1=A1, Aitem3=A3, Aitem2=A2, Aitem4=A4, Aitem5=A5}]
src:[{Aitem1=A1, Aitem3=A3, Aitem2=A2, Aitem4=A4, Aitem5=A5}]
dst:[{Aitem1=A1-2, Aitem3=A3-2, Aitem2=A2-2, Aitem4=A4, Aitem5=A5}]

となり、ディープコピー先のdstオブジェクトに対して変更を行っても、コピー元のsrcオブジェクトには影響ありません。

ちなみに、deepCopy内でコメントオフしているシャローコピー(cloneメソッド)を有効にして、ディープコピーをコメントオフして実行すると、

src:[{Aitem1=A1, Aitem3=A3, Aitem2=A2, Aitem4=A4, Aitem5=A5}]
src:[{Aitem1=A1-2, Aitem3=A3-2, Aitem2=A2-2, Aitem4=A4, Aitem5=A5}]
dst:[{Aitem1=A1-2, Aitem3=A3-2, Aitem2=A2-2, Aitem4=A4, Aitem5=A5}]

となり、シャローコピーではコピー先への変更がコピー元にも影響します。

posted by 台北猫々 at 23:15| Comment(0) | TrackBack(1) | 技術メモ(Java)