java中引用类型的问题
本文介绍了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屋!
查看全文