コードは、書かれているように1回のみループします。のは、見てみましょう:
List<List<Integer>> result = new ArrayList<>();
result.add(new ArrayList<>());
これは、要素List<Integer>
あるList
、あるresult
を、初期化します。結果に1つの要素を追加すると、result
は単一要素のリストになります。その1つの要素自体がゼロ要素リストです。ここで
List<List<Integer>> temp = new ArrayList<>();
、あなたはまた、その要素型としてList<Integer>
を含むList
するtemp
を初期化しますが、それは空です。
for (List<Integer> list: result) {
list.add(10000);
temp.add(new ArrayList(list));
}
ここで、result
には1つの要素しかありません。その1つの要素は、あなたが2行目に与えたもので、result.add(new ArrayList<>());
です。このループはresult
の各要素を繰り返し処理します。result
には1つの要素しかないため、ループは1回だけループします。
この場合、result
の最初の要素は、空のリストではなく10000
のリストに更新されます。したがってresult
はまだシングルトンリストになりますが、その1つの要素は10000
を含むシングルトンリストになります。
temp.add(new ArrayList(list))
を呼び出します。 new ArrayList(list)
を呼び出すと、list
のすべての要素を含むArrayList
が作成されます。あなたがそれを呼び出すと、list
は10000
を含むシングルトンなので、new ArrayList(list)
も数字10000
を含むシングルトンです。次に、ArrayList
をtemp
に追加します。これは以前は空のリストでした。現在、temp
はシングルトンであり、その1つの要素は10000
を含むシングルトンリストです。
この時点で、result
とtemp
はどちらも正確に1つの要素を含むリストであり、それぞれ正確に1つの要素を含むリストであり、番号は10000
です。そのため、とtemp
の値は[[10000]]
です。[10000]
は数字が10000
のリストで、[[10000]]
のリストはちょうど[10000]
のリストです。