Javaのリストadd(list)が空の問題

1628 ワード

参考博文
List呼び出しadd()メソッドが空解釈(qq_34250494の回答)
LeetCode 39をしています.Combination Sumでは再帰を使用しており、適切な条件でリストresultに結果を追加している.
class Solution {
    public List> combinationSum(int[] candidates, int target) {
        Arrays.sort(candidates);
		List> result = new ArrayList();
		getResult(result, new ArrayList(), candidates, target, 0);
		return result;
    }
    
    private void getResult(List> result, List arrayList, int[] candidates,
			int target, int start) {
		// TODO Auto-generated method stub
		if(target > 0) {
			for(int i = start; i < candidates.length;i ++) {
				if(target >= candidates[i]) {
					arrayList.add(candidates[i]);
					getResult(result, arrayList, candidates, target - candidates[i], i);
					arrayList.remove(arrayList.size() - 1);
				}
			}
		}else if(target == 0) {
			result.add(new ArrayList(arrayList));
		}
	}
}

ここで、getResult()メソッドに最後にarayListを追加すると、結果は空になりますがresultを使用すると問題が発生します.add(new ArrayList(list))は、正しい結果を返すことができます.このコードを使って説明したほうがいいです.
ArrayList list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
List>  res = new ArrayList<>();
System.out.println(res);
res.add(list);
list.add(50);
res.add(list);
System.out.println(res+"          ");

resの各要素はListタイプであり,変数リストを用いて参照するリストデータを指す.resに格納されるのもlistが指すデータです.
なぜ私が直面した問題でresultを巡ると空に戻るのかは、arrayListがメソッドのパラメータとしてメソッドの終了時にスタックフレームが回収され、そのすべての内容がローカル変数テーブルを含むことが有効ではないためです.だからresultが指すlistはすべて空です.