1

好的,在我的程序中,我创建了 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;

为什么?我做错了什么?

4

6 回答 6

1

LinkedList<List<Marker>> list2 add方法不会创建您添加到其中的列表的副本。它只添加了list1to的引用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));
于 2013-07-26T09:22:19.820 回答
1

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

正如您使用的那样ArrayList,它支持重复元素,因此每次添加标记对象时都会创建一个重复条目。

于 2013-07-26T09:23:01.573 回答
1

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

于 2013-07-26T09:24:31.510 回答
1

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

于 2013-07-26T09:30:39.630 回答
0

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

 list1.add(mark);

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

于 2013-07-26T09:23:24.747 回答
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 个列表

于 2013-07-26T09:27:16.667 回答