Javaでオブジェクト(ArrayListなど)のディープコピーを行う
台北猫々
台北猫々
ATOMRSS
  • codeなにがしブックマークに追加する 0 users
  • このページを del.icio.us に追加
  • このページをはてなブックマークに追加
  • GoodJob
  • 16

GJ

GJGJGJGJGJGJ

説明

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}]
となり、シャローコピーではコピー先への変更がコピー元にも影響します。

ソースコード

コメント

  • ゲスト
  • 1:ゲスト (tkj)
  • 2010/01/26 20:54

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

  • GoodJob
  • 0

  • NAT
  • 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"が出力されます。
これが役に立つ事があるのかどうかは分かりませんが・・・。

  • GoodJob
  • 0

前へ 1 次へ

プレゼン公開・共有サイト handsOut.jp チーム・マイナス6% - みんなで止めよう温暖化

ソースコードのブログパーツ

デフォルトのフォントサイズ
修飾
表示サイズ
px px
プレビュー (表示する)
下のプレビュー領域をクリックすると、ポップアップで全体を見ることができます。
パラメータが不正です

    GoodJobしたユーザ

    • NAT

    ブックマークコメント

    関連するなにがし

    前へ 1 次へ

    タグ

    raketime machineイベントログfilesystemobjectdeveloperprogrammingprimenumberflexriatagged電卓分数逆ポーランド記法ポーランド記法jaxbdyndnsarraylistdeepcopyディープコピーobjectoutputstreambytearrayoutputstreamobjectinputstreambytearrayinputstreamiterator複数チェックボックスmultibytexencentos文字エンコーディングinit_connectcharacter-set-servercollation-serverdefault-character-setヘルパーメソッド動的メソッド呼び出しf:labelwsse2重登録防止prototype.js位置positionedoffsetscrolltoスクロールpositionlink_tocyclecheck_box_tagチュートリアルactive_formerror_messages_forハイライトバリデーションvalidate便利リストデコレーションメールデコメ非対応機種tilestext_field_tag一括複数情報etherealrtphexテキストデータ抽出validwhenリセット一括更新plop置換replacepcoslogmixisregソケットnet::telnetfopenmutexサンプルcalendar[linux][bash][シェルスクリプト][大容量]mobilerorrails2.1クリップボードclipboard横向きピラミッドs2jdbc-genjsonicお絵かきフルパス名抽出サブドメインサブドメイン名s2jdbc自動生成エンティティxhtml

    前へ 1 2 3 ... 8 次へ