Java使用列表来存储列表

时间:2013-11-17 10:27:07

标签: java list for-loop store

我尝试创建一个包含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次! 你知道吗,原因是什么?

3 个答案:

答案 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对象,然后将此列表对象添加到列表对象列表中。

想想这样的情况:

enter image description here 一种解决方法可能是:

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也发生了变化。