【Java】この事象を説明できますかい


あなたのJava力を試してみてください。

以下のコードを見て下さい。
arrayListのすべての値に"D"を代入しようとしています。

ExtentionForSample.java
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("A");
arrayList.add("B");
arrayList.add("C");
for(String str : arrayList) {
    str = "D";
    System.out.println(str);
}
System.out.println(arrayList);

結果

D
D
D
[A, B, C]

なぜこの結果になったのかを説明できるか。

答え

ローカル変数の参照先を変更していただけだから。。。

説明しよう

ローカル変数に新しい参照先を代入しているだけだった。
参照先の"A"に影響はない

修正する

ExtentionForSample.java
//中略
for(int i=0; i < arrayList.size(); i++) {
    arrayList.set(i, "D");
}
System.out.println(arrayList);

ArrayList.set(int index, E element)を使用する

結果

[D, D, D]

ちなみに

ExtentionForSample.java
Map mapA = new HashMap<String,String>(){{put("1", "A");}};
Map mapB = new HashMap<String,String>(){{put("1", "B");}};
Map mapC = new HashMap<String,String>(){{put("1", "C");}};
arrayListMap.add(mapA);
arrayListMap.add(mapB);
arrayListMap.add(mapC);
for(Map map:arrayListMap) {
    map.put("2", "D");
}
System.out.println(arrayListMap);

結果

[{1=A, 2=D}, {1=B, 2=D}, {1=C, 2=D}]

まとめ

ローカル変数に代入した参照先に対して、データ操作すると参照先に反映される。