2011年03月12日

List,Mapのシャドウコピーに注意

javaでList,Mapなどのコピーを行う場合は、
シャドウコピーに注意が必要です。

シャドウコピーの場合、
変数名が違っても参照している値が同じであるため、
一方の変数を更新すると、コピー元である変数も更新されます。

■サンプルソース
 ShadowCopy.java
------------------------------------------------------------------------------------------
01 import java.util.ArrayList;
02 import java.util.List;
03
04 public class ShadowCopy {
05
06   public static void main(String[] args) {
07     List listA = new ArrayList(16);
08     List listB = new ArrayList(16);
09     List listC = new ArrayList(16);
10
11     listA.add("element1");
12     listA.add("element2");
13
14     System.out.println("コピー前");
15     System.out.println("listA=" + listA);
16
17     /** addAllを使ってコピー (コピー先を変更してもコピー元は値が変わらない)*/
18     listB.addAll(listA);
19     listB.add("element3");
20     System.out.println("コピー後(正常)");
21     System.out.println("listA=" + listA);
22     System.out.println("listB=" + listB);
23
24     /** シャドウコピー (コピー先を変更するとコピー元も値が変わる) */
25     listC = listA;
26     listC.add("elemanet3");
27     System.out.println("シャドウコピー後");
28     System.out.println("listA=" + listA);
29     System.out.println("listC=" + listC);
30
31   }
32 }
------------------------------------------------------------------------------------------
■実行結果
コピー前
listA=[element1, element2]
コピー後(正常)
listA=[element1, element2]
listB=[element1, element2, element3]
シャドウコピー後
listA=[element1, element2, elemanet3]
listC=[element1, element2, elemanet3]
------------------------------------------------------------------------------------------

listCのように"="で設定すると同じ値を参照します。⇒シャドウコピー
listBのようにaddAllを使えば独立した値を作ります。
(Mapの場合はputAll)
posted by chan at 01:41| Comment(0) | java | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。