LoginSignup
0
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2020-05-04

あなたの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]

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

答え

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

説明しよう

ローカル変数代入.png

ローカル変数に新しい参照先を代入しているだけだった。
参照先の"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}]

ローカル変数代入_map.png

まとめ

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

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0