ArrayList中ArrayList的意外行为

时间:2015-06-06 13:21:20

标签: java arraylist

我正在尝试使用ArrayList<ArrayList<String>>来解析网页中的某些片段,但我的代码中出现了问题:

ArrayList<ArrayList<String>> x = new ArrayList<ArrayList<String>>();
ArrayList<String> s = new ArrayList<String>();

int z, y, w = 0;
for(z=0; z<3;z++)
{
    s.clear(); 
    for(y=0;y<4;y++)
    {
        s.add(""+w++);
    }
    x.add(s);
}

for(ArrayList<String>  tr : x)
{
    for( String t : tr)
    {
        System.out.println(t);
    }
    System.out.println("-----------------");
}

输出结果为:

8
9
10
11

8
9
10
11

8
9
10
11

而不是(我的预期输出):

0
1
2
3

4
5
6
7

8
9
10
11

有人可以向我解释为什么会这样吗?感谢。

3 个答案:

答案 0 :(得分:8)

<循环中对象的预期行为,因为s在每次迭代中都是同一个对象,所以需要在循环中创建新对象。

像这样更改你的代码:

for(z=0; z<3;z++)
{
    s = new ArrayList<String>();
    for(y=0;y<4;y++)
    {
        s.add(""+w++);
    }
    x.add(s);
}

答案 1 :(得分:2)

您正在多次向外部ArrayList添加相同的内部ArrayList引用。因此,所有内部ArrayList都是相同的对象,并包含相同的元素。

您必须为外循环的每次迭代创建一个新实例:

for(z=0; z<3;z++)
{
    s = new ArrayList<String>(); 
    for(y=0;y<4;y++)
    {
        s.add(""+w++);
    }
    x.add(s);
}

答案 2 :(得分:0)

上面的程序反复重复使用相同的ArrayList(内部列表:s),因此只得到最后一组值,

将第2行(内部Arraylist初始化)移动到循环内部,如下所示,以获得所需的结果,

    ArrayList<ArrayList<String>> x = new ArrayList<ArrayList<String>>();
    int z,y,w=0;
    for(z=0; z<3;z++)
    {
        ArrayList<String> s = new ArrayList<String>(); 
        for(y=0;y<4;y++)
        {
            s.add(""+w++);
        }
        x.add(s);
    }

    for(ArrayList<String>  tr : x)
    {
        for( String t : tr)
        {
            System.out.println(t);
        }
        System.out.println("-----------------");
    }