我尝试创建一个包含2个列表的程序; list1(List<Integer>
),它将不断添加新值,list2(List<List<Integer>>
),它将存储list1的值。我从这开始:
int x=1;
while(x<=10)
{
list1.add(x);
System.out.println(list1);
x++;
}
输出就像我想的那样;
[1]
[1, 2]
[1, 2, 3]
[1, 2, 3, 4]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5, 6]
[1, 2, 3, 4, 5, 6, 7]
[1, 2, 3, 4, 5, 6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
然后我将System.out.println(list1);
更改为list2.add(list1);
,然后包含了一个增强的for循环;
for(List<Integer> y:list2)
{
System.out.println(y);
}
但不是像以前那样输出,它说:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
就像它只重复了list1的最后状态10次! 你知道吗,原因是什么?
答案 0 :(得分:4)
列表很可能引用相同的List
对象。为避免这种情况,您希望每次迭代添加new List<Integer>
。
你可以做这样的事情
int x = 1;
while (x <= 10) {
int y = 1;
while (y <= x) {
List<Integer> list = new List<Integer>();
list.add(y);
y++;
}
y = 1;
list2.add(list);
}
for (List<Integer> list: list2){
System.out.println(list);
}
答案 1 :(得分:4)
因为您在每次迭代时将整数添加到相同 List
对象,然后将此列表对象添加到列表对象列表中。
想想这样的情况:
一种解决方法可能是:
int x=1;
while(x <= 10){
l1 = new ArrayList<>(l1);//create a new list object with values of the old one
l1.add(x);
l2.add(l1);
x++;
}
答案 2 :(得分:0)
列表很可能引用相同的List对象,在将list1添加到list2后,您更改了list1.so list2中的list1也发生了变化。