java中引用类型的问题

查看:106
本文介绍了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都是引用了同一个对象,但是也不应该为空啊?有没有人解答一下?

解决方案

你这个循环里一直在做插入一个数,然后再把这个数给删掉,逻辑最终走完后这个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有任何影响。

这篇关于java中引用类型的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆