2016-11-30 14 views
-2

私はラインres.add(new ArrayList<Integer>(temp));と混同しています。 res.add(temp)を使用すれば、なぜそれが間違っているのか教えてください。ArrayListの初期化で混乱しています

public void dfs(int[] nums, int index, List<List<Integer>> res, List<Integer> temp) { 
    res.add(new ArrayList<Integer>(temp)); 
    for(int i = index; i < nums.length; i++) { 
     temp.add(nums[i]); 
     dfs(nums, i + 1, res, temp); 
     temp.remove(temp.size() - 1); 
    } 
} 
+0

あなたは別のリストの周りに 'ArrayList'を初期化していますが、それ自体は何も_wrong_はありません。たぶんあなたは 'addAll()'を使うつもりでした。 –

+1

javaは混乱しません。あなただけが混乱します – sasikumar

+0

これら2つのメソッドの呼び出しコードも表示できますか?メソッドの呼び出し後に 'res'をどのように使うつもりであるかは不明です。 –

答えて

0

変数tempは、この場合、Integersのリストメモリ内のオブジェクトへのオブジェクト参照です。 tempremoveメソッドを呼び出すと、tempが指し示すlistオブジェクトが実際に変更されます。したがって、forループの後に、tempを使用しようとすると空のリストが表示されることがあります。実際new ArrayList<Integer>(temp)を使用して

は、他の言葉で、それはその新しいlist of Integerオブジェクトを参照しない、オリジナルのtemp参照とは関係がないことをメモリに新しいlist of Integersオブジェクトを作成します。つまり、基本的には新しいlist of Integersです。

+0

素敵な説明!どうもありがとうございます! –