将项添加到ArrayLists的LinkedList大小错误



Okey,在我的程序中,我创建了ArrayLists:的LinkedList

 List<Marker> list1 = new ArrayList<Marker>();
 LinkedList<List<Marker>> list2 = new LinkedList<List<Marker>>();

将项目添加到列表1:list1.add(mark); 时一切正常

但当我尝试将我的list1添加到list2(list2.add(list1))时,我会遇到一些奇怪的事情:list2中的每个列表大小都等于上次添加的列表大小+1,我甚至无法用(例如)list2.getFirst().get(0);读取这些列表项——这样做我就出错了;

例如,我正在这样做:

mark.addSomeInfo();
list1.add(mark);
list2.add(list1);
mark.addSomeInfo();
list1.add(mark);
list2.add(list1);
mark.addSomeInfo();
list1.add(mark);
list2.add(list1);

我需要得到这个:

list2.get(0).size() = 1;
list2.get(1).size() = 2;
list2.get(2).size() = 3;

但我得到的却是:

list2.get(0).size() = 4;
list2.get(1).size() = 4;
list2.get(2).size() = 4;

为什么?我做错了什么?

LinkedList<List<Marker>> list2 add方法不会创建您添加到其中的列表的副本。它只向list2添加list1的引用。因此,从本质上讲,您的list2包含对同一列表的3个引用。

您想做的是在将副本放入list2 时自己创建副本

mark.addSomeInfo();
list1.add(mark);
list2.add(new ArrayList<Mark>(list1));
mark.addSomeInfo();
list1.add(mark);
list2.add(new ArrayList<Mark>(list1));
mark.addSomeInfo();
list1.add(mark);
list2.add(new ArrayList<Mark>(list1));

List2中的引用指向List1。。这就是为什么所有相同的SOP都给出相同的结果4

list1只是代码中的一个引用。因此,从本质上讲,您正在一次又一次地向linkedlist添加相同的arraylist对象。最后,在您的示例中,相同的arraylist被复制了3次,大小为4。

LinkedList的所有引用都指向同一个List对象,即list1,因此它打印尺寸为4。

由于您使用了支持重复元素的ArrayList,所以每次添加标记对象时,它都会生成一个重复条目。

在list2的第0、第1和第2个位置,添加了相同的list1对象。正在更改

 list1.add(mark);

由于上面的函数在您的代码中已经被调用了四次。因此,list1引用现在指向堆上有4个项的对象,因此list1的所有3个项目的大小都有4个元素。

mark.addSomeInfo();
list1.add(mark);  //this gets added to list each time you add it --1
list2.add(list1); //this gets added too as many times as you add list1
mark.addSomeInfo();
list1.add(mark);  // 2
list2.add(list1);  //2
mark.addSomeInfo();
list1.add(mark);  // 3
list2.add(list1);  // 3

因此,在这之后,您将在list1中有3个元素,在list2中有三个列表