Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

ArrayListをできるだけ簡単にディープコピーする方法

はじめまして。
ArrayListをできるだけ簡単にディープコピーする方法を教えてください。

下記ソースでやりたい事は、_allListに保存しておいた値を別のArrayListにコピーして、ArrayListに詰まっているHashMapの値を上書きして使いたいのですが、上書きをした時に、_allListの値も更新されてしまいます。

_allListの値は保持したままにしたいのです。
何かよい方法はありませんでしょうか。
普通皆様はどのようにやっているのでしょうか。

教えてください。よろしくお願いします。

-------------------------------------------------------------------

【現ソース】
package test;

import java.util.ArrayList;
import java.util.HashMap;

public class testDate {

    protected static ArrayList _allList = null;

    public static void main(String[] args){
    
        HashMap mapA_1 = new HashMap();        
        mapA_1.put("Aitem1", "A1");
        mapA_1.put("Aitem2", "A2");
        mapA_1.put("Aitem3", "A3");
        mapA_1.put("Aitem4", "A4");
        mapA_1.put("Aitem5", "A5");       
        
        HashMap mapA_2 = new HashMap();
        mapA_2.put("Aitem1", "A1-2");
        mapA_2.put("Aitem2", "A2-2");
        mapA_2.put("Aitem3", "A3-2");
        
        // listZにマップをセット
        ArrayList listZ = new ArrayList();
        listZ.add(mapA_1);
        
        // _allListに保存
        _allList = listZ;
        System.out.println("_allList:"+_allList);

        // listYを作成し_allListの内容をコピー
        ArrayList listY = new ArrayList();
        listY = _allList;

        // mapA_1の中身をmapA_2で上書きする
        HashMap tmpMap = (HashMap)listY.get(0);
        tmpMap.putAll(mapA_2);

        System.out.println("tmpMap:"+tmpMap);
        System.out.println("_allList:"+_allList);
    }
}

【実行結果】
_allList:[{Aitem4=A4, Aitem3=A3, Aitem2=A2, Aitem1=A1, Aitem5=A5}]
tmpMap:{Aitem4=A4, Aitem3=A3-2, Aitem2=A2-2, Aitem1=A1-2, Aitem5=A5}
_allList:[{Aitem4=A4, Aitem3=A3-2, Aitem2=A2-2, Aitem1=A1-2, Aitem5=A5}]


【こうしたい】
_allList:[{Aitem4=A4, Aitem3=A3, Aitem2=A2, Aitem1=A1, Aitem5=A5}]
tmpMap:{Aitem4=A4, Aitem3=A3-2, Aitem2=A2-2, Aitem1=A1-2, Aitem5=A5}
_allList:[{Aitem4=A4, Aitem3=A3, Aitem2=A2, Aitem1=A1, Aitem5=A5}]
↑コピー後の_allListの中身は変わらず
-------------------------------------------------------------------

1

回答

6865

閲覧

1件の回答

評価

0

>listY = _allList;
これは、何もコピーしてませんよ。

cloneメソッドではだめですか。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。