疑問解決
初めての質問のため、至らない部分があるかと存じますが、ご了承ください。
1次元リストから要素を2つずつ取り出して2次元リストを作る場合を想定します。
前提
Java初心者です。
QiitaというサイトでArrayListのnewとclear()の違いに関する記事を拝見していたのですが
配列の格納のされ方がよくわからず、関係のないところで気になってしまい
自分で確認できないか試してみたんですが、足跡は追えてもなぜそういう動きをするのかがわからないため質問させていただきます。
以下記事に掲載されていたソースコードです。
import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class TestArraylist { public static void main(String args[]) { // 出力用の2次元リスト List<ArrayList<String>> sampleLists = new ArrayList<>(); // sampleListsに要素を追加するための一時的なリスト ArrayList<String> listA = new ArrayList<>(); // 適当なサンプル List<String> listB = Arrays.asList("AA", "BB", "CC", "DD", "EE", "FF"); // 要素数が2のリストを作ってsampleListsに追加する for (int i = 0; i < listB.size(); i++) { if (i % 2 == 0) { listA.add(listB.get(i)); continue; } sampleLists.add(listA); listA.add(listB.get(i)); // new前の確認 System.out.println(sampleLists); // 一時的なリストをnewする listA = new ArrayList<>(); // new後の確認 System.out.println(sampleLists); } } }
出展:https://qiita.com/RoG/items/850390f97702144471cf
listAにlistBの”AA”を格納した後に、ifブロックを抜けsampleListにlistAの"AA"を格納したのち
listAにlistBの"BB"を格納しているのですが、その結果、sampleListになにも格納していないにも関わらず、listAに格納したはずの"BB"がsampleListにも格納されていました。
なぜなのでしょう。
試したこと
足跡がわかるように通ったところにa,b,c,dと出力するようにしたのですが
仕組みがわかりませんでした。
上記省略
for
1 System.out.println("a"); 2 if (i % 2 == 0) { 3 listA.add(listB.get(i)); 4 System.out.println("b"); 5 continue; 6 } 7 System.out.println("d"); 8 System.out.println(sampleLists); 9 10 sampleLists.add(listA); 11 12 System.out.println(sampleLists); 13 System.out.println(listA); 14 15 listA.add(listB.get(i)); 16 // new前の確認 17 System.out.println(sampleLists); 18 System.out.println(listA); 19 System.out.println("c"); 20 21 // 一時的なリストをnewする 22 listA = new ArrayList<>(); 23 // new後の確認 24 System.out.println(sampleLists); 25 System.out.println(listA); 26 } 27 } 28}
出力結果
a
1b 2a 3d 4[] 5[[AA]] 6[AA] 7[[AA, BB]] 8[AA, BB] 9c 10[[AA, BB]] 11[] 12a 13b 14a 15d 16[[AA, BB]] 17[[AA, BB], [CC]] 18[CC] 19[[AA, BB], [CC, DD]] 20[CC, DD] 21c 22[[AA, BB], [CC, DD]] 23[] 24a 25b 26a 27d 28[[AA, BB], [CC, DD]] 29[[AA, BB], [CC, DD], [EE]] 30[EE] 31[[AA, BB], [CC, DD], [EE, FF]] 32[EE, FF] 33c 34[[AA, BB], [CC, DD], [EE, FF]] 35[]
回答1件
あなたの回答
tips
プレビュー