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