- ソースコードID: 695
- 登録日時: 2008/12/24 14:35
- 最終更新日時: 2010/01/26 23:34
- アクセス数: 4677
- タグ: java ディープコピー bytearrayoutputstream deepcopy bytearrayinputstream objectoutputstream arraylist objectinputstream
説明
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}]
となり、シャローコピーではコピー先への変更がコピー元にも影響します。コメント

- 2:NAT
- 2010/01/26 23:34
これは面白いディープコピーの方法ですね。
シリアライズは、異なるオブジェクトが同じオブジェクトを参照している状態もコピーしてくれるので、以下のコードは面白い結果になります。
public static void main(String[] args) {
ArrayList<String> l1 = new ArrayList<String>();
l1.add("A1");
l1.add("A2");
ArrayList<String> l2 = new ArrayList<String>();
l2.add("B1");
ArrayList<ArrayList<String>> src = new ArrayList<ArrayList<String>>();
src.add(l1);
src.add(l2);
src.add(l1); // srcの0番目と同じArrayListを参照
System.out.println("src:" + src);
ArrayList<ArrayList<String>> dst = (ArrayList<ArrayList<String>>)deepCopy(src);
dst.get(0).add("A3");
System.out.println("src:" + src);
System.out.println("dst:" + dst);
}
出力結果:src:[[A1, A2], [B1], [A1, A2]]
src:[[A1, A2], [B1], [A1, A2]]
dst:[[A1, A2, A3], [B1], [A1, A2, A3]]
dstの0番目のArrayListに"A3"を追加したので、同じArrayListを参照する2番目にも"A3"が出力されます。これが役に立つ事があるのかどうかは分かりませんが・・・。
前へ 1 次へ![]()












java.io.NotSerializableException: oracle.sql.TIMESTAMP
のように、Serializableじゃないとだめですね。
その他の場合は万能に使えます。すばらしいです。