Java で配列やコレクションをコピーして、コピー先に変更を加えても、コピー元が影響を受けないコピーをディープコピーといいます。
ネットで調べると、int
や String
を型引数にして、
ArrayList myList = new ArrayList<MyObject>( srcList );
などとするとディープコピーが作れますと、書いてありますが、実はリストに格納しているのがオブジェクトの場合、ディープコピーになりません!!
なので、単にコレクションを引数にとって new
するだけではだめです。
オブジェクトのコレクションなどをディープコピーするには、
ArrayList<MyObject> myList = new ArrayList<MyObject>(srcList.size());
for (MyObject o : srcList) {
// 以下のどちらかを実装
o.add(new MyObject(new o)); // コピーコンストラクタ
o.add(o.clone()); // Clonable インターフェース実装
}
のように、コピーコンストラクタをコレクションに入れるオブジェクトに用意するか、もしくはclone
メソッドの継承をしないといけないようです。
(どちらか一方のやり方でよい)
Cloneable インターフェースの実装について:
http://qiita.com/SUZUKI_Masaya/items/8da8c0038797f143f5d3
オブジェクトの Collection をディープコピーする質問:
http://stackoverflow.com/questions/715650/how-to-clone-arraylist-and-also-clone-its-contents