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

时间:2013-07-26 09:17:56

标签: java arraylist size

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

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

将项目添加到list1时,一切正常: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;

为什么呢?我做错了什么?

6 个答案:

答案 0 :(得分:1)

LinkedList<List<Marker>> list2 add方法不会创建您添加到其中的列表的副本。它只会将list1的引用添加到list2。所以实质上你的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));

答案 1 :(得分:1)

LinkedList的所有引用都引用相同的List对象list1,因此它会打印大小为4.

正如您使用支持重复元素的ArrayList所以每次添加标记对象时,它都会重复输入。

答案 2 :(得分:1)

List2中的引用是针对List1的。这就是为什么所有相​​同的SOP给出相同的结果4

答案 3 :(得分:1)

list1只是代码中的引用。实质上,您是一次又一次地向arraylist添加相同的linkedlist对象。最后,在您的示例中,相同的arraylist被复制3次,并且大小为4。

答案 4 :(得分:0)

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

 list1.add(mark);

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

答案 5 :(得分:0)

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中有3个列表