所以我在
中定义了两个带有arraylists的arrayListsArrayList <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));
现在发生了最令人震惊的事情......数组var1.get(k)
与var1.get(k+3)
纠缠在一起...所以0与3,1与4和2与5以下列方式... < / p>
如果我做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
请一些好心灵告诉我为什么会发生这种魔法?
这样做的正确方法是什么?
由于
答案 0 :(得分:1)
你的最后两个循环(我假设它们没有嵌套,否则这段代码不能通过编译)将每个内部List
引用从var2
复制到{{}} {1}}:
var1
因此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)
&amp; var1.get(1)==var1.get(4)
。
因此,当您清除var1.get(2)==var1.get(5)
引用的List
时,您还会清除var1.get(i)
引用的List
(因为它var1.get(i+3)
List
})。
另外,如果我做var2.clear(),它也会清除var1
你一定是弄错了。只有将var1
分配给var2
或反之亦然,才会发生这种情况。
这样做的正确方法是什么?
如果您希望var1
包含var2
的每个元素的两个副本,则必须创建内部ArrayList
的副本:
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)));
}