2017-10-29 82 views
1

所以我定义2周的ArrayList用的ArrayList内纠缠的ArrayList ......很奇怪的问题

ArrayList <ArrayList> var1 = new ArrayList<ArrayList>(); 
ArrayList <ArrayList> var2 = new ArrayList<ArrayList>(); 

然后我初始化VAR1:

for(i=0;i<3;i++){ 
    var1.add(new ArrayList<Integer>()); 
    var1.get(i).add(1); 
} 

然后,我复制到VAR1和VAR2我抹去VAR1 ..

for(int k=0;k<var1.size();k++){ 
     var2.add(var1.get(k)); 
    } 
    var1.clear(); 

然后我复制到VAR2 var1的2倍

for(int k=0;k<var2.size();k++){ 
     var1.add(var2.get(k)); 
for(int k=0;k<var2.size();k++){ 
     var1.add(var2.get(k)); 

而且现在stragest的事情发生......阵列var1.get(k)var1.get(k+3) ......所以0 3,1 4和2以下列方式5 ...

如果我这样做var1.get(0).clear() 它不仅抹去var1.get(0) ...但我还会清除var1.get(3) 如果我做var1.get(0).add(1) ...它不仅能补充整数1到var1.get(0)但同时也增加了它变成var1.get(3)

而且,如果我做var2.clear()它也清除var1

请一些好的灵魂可以告诉我为什么这个魔术发生了吗?

这样做的正确方法是什么?

感谢

回答

1

你的最后两个循环(和我假设他们没有嵌套,否则该代码将无法通过编译)复制每个内部List参考两次从var2var1

for(int k=0;k<var2.size();k++) { 
    var1.add(var2.get(k)); 
} 
for(int k=0;k<var2.size();k++) { 
    var1.add(var2.get(k)); 
} 

因此var1.get(0)==var1.get(3)var1.get(1)==var1.get(4) & var1.get(2)==var1.get(5)

因此,当你清除var1.get(i)引用的List,你也很清楚通过var1.get(i+3)引用的List(因为它是相同的List)。

而且,如果我做var2.clear()还会清除VAR1

你必须在这里错了。只有当您将var1指定为var2或反之亦然时才会发生这种情况。

什么是这样做的正确方法是什么?

如果你想var1包含的var2每个元素的两个副本,必须创建内部ArrayList S的副本:

for(int k=0;k<var2.size();k++) { 
    var1.add(new ArrayList<>(var2.get(k))); 
} 
for(int k=0;k<var2.size();k++) { 
    var1.add(new ArrayList<>(var2.get(k))); 
} 
+0

感谢救了我的命:) – Felipe