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}]
となり、シャローコピーではコピー先への変更がコピー元にも影響します。
2008年12月25日
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/24764294
この記事へのトラックバック
http://blog.sakura.ne.jp/tb/24764294
この記事へのトラックバック