java中引用类型的问题

请输入代码
public class Test2 {
    private static List<List<Integer>> result;
    public static List<List<Integer>> combine(int n,int k){
        ArrayList<Integer> temp=new ArrayList<>();
        if(n<=0||k<=0||k>n){
            return result;
        }
        generateCombination(n,k,1,temp);
        return result;
    }
    public static void generateCombination(int n,int k,int start,ArrayList<Integer> list){//将从start开始的所有的可能情况放入到list中
        if (list.size()==k){
            **result.add((List<Integer>) list.clone());**
            /*System.out.println(result.toString());*/
            return;
        }
        for(int i=start;i<=n;i++){
            list.add(i);
            generateCombination(n,k,i+1,list);
            list.remove(list.size()-1);
        }
    }
    public static void main(String[] args) {
        Scanner sin=new Scanner(System.in);
        int N=sin.nextInt();
        int K=sin.nextInt();
        result=new ArrayList<>();
        System.out.println(combine(N,K));
    }
}

为什么
result.add(list)
在主程序中打印的时候输出result的都是空呢?
而使用result.add((List<Integer>) list.clone());才能把list中的内容保存到result里边,
就算result里边每一次add都是引用了同一个对象,但是也不应该为空啊?有没有人解答一下?

阅读 1.9k
1 个回答

你这个循环里一直在做“插入一个数,然后再把这个数给删掉”,逻辑最终走完后这个list就是空的。
for(int i=start;i<=n;i++){
list.add(i);
generateCombination(n,k,i+1,list);
list.remove(list.size()-1);
}

既然result里引用的是同一个list,自然输出结果也是空的。而clone后则把这两者的引用关系给隔离开了,操作list就不会对result里的list有任何影响。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题