纠缠在Java中的ArrayLists ......非常奇怪的问题

时间:2017-10-29 08:44:40

标签: java arraylist

所以我在

中定义了两个带有arraylists的arrayLists
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));

现在发生了最令人震惊的事情......数组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

请一些好心灵告诉我为什么会发生这种魔法?

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

由于

1 个答案:

答案 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)));
}