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