2015-05-03 40 views
1
我有理解尺寸的输出问题

Java的ArrayList的大小

ArrayList<ArrayList<ArrayList<ArrayList<String>>>> myEmpls = new ArrayList<>(); 
ArrayList<ArrayList<ArrayList<String>>> dummy2 = new ArrayList<>(); 
ArrayList<ArrayList<String>> dummy = new ArrayList<>(); 

     for (int x = 0; x < 4; x++) { 
     myEmpls.add(dummy2); 
    } 

    System.out.println(myEmpls.size()); 

    // returns 4 as expected 

    System.out.println(myEmpls.get(0).size()); 
    System.out.println(myEmpls.get(1).size()); 

    // both return 0 as expected 

    for (int x = 0; x < 10; x++) { 
     myEmpls.get(0).add(dummy); 
    } 
    System.out.println(myEmpls.get(1).size()); 

    // returns 10 altough I added to myEmpls.get(0) and not 
    // myEmpls.get(1) so I expected this to still be 0. 

有人可以解释为什么是这样的情况?也许我错过了一些明显的东西。

在此先感谢。

+0

都不尽dummy2s一样吗? – ChiefTwoPencils

+0

感谢所有的答案,我之前遇到过同样的问题,但由于我没有编码一段时间,所以我没有认出它! – user2299050

回答

3

您正在向myEmpls的所有四个位置添加相同的参考dummy2。因此,当你访问它们中的任何一个时,你访问的变量为dummy2,它实际上有10个对象,因为你把它添加进去了。

你甚至可以做到这一点,它也返回10

System.out.println(dummy2.size()); 

如果你这样做

for (int x = 0; x < 4; x++) { 
    myEmpls.add(new ArrayList<ArrayList<ArrayList<String>>>()); 
} 

这将表现为你所期望

1

myEmpls.add(dummy2);添加相同ArrayList实例为myEmpls muptiple次。

因此,调用​​将元素添加到myEmpls.get(1)所指的同一个ArrayList实例中。因此,size()myEmpls.get(1)是10,因为myEmpls(0)==myEmpls(1)

如果你改变你的第一个循环到:

for (int x = 0; x < 4; x++) { 
    dummy2 = new ArrayList<>(); 
    myEmpls.add(dummy2); 
} 

myEmpls每个元素将是不同的,并且如你预期myEmpls.get(1).size()将返回0。

1

原因是您创建了一个ArrayList对象(dummy2),然后将该确切对象添加到列表中4次。因此,当您将dummy添加到myEmpls.get(0)的对象中时,您将为其他3个索引添加虚拟,因为它们都是相同的对象。因此,大小为10. myEmpls中的每个索引都指向内存中完全相同的地址,因此无论您对其中一个索引执行什么操作,您都可以对其他所有索引执行操作。

1

列表保持的Object在其加入的Object状态的参考,变化反映到所有在你的情况列表添加引用。

ForExample:

ArrayList<List<String>> mainList =new ArrayList<>(); 
    List<String> test1 = new ArrayList<>(); 
    mainList.add(test1); 
    mainList.add(test1); 
    mainList.add(test1); 
    mainList.add(test1); 

    System.out.println(mainList); 

    test1.add("Hello");//now add item to test1 

    System.out.println(mainList); 

输出

[[], [], [], []] 
[[Hello], [Hello], [Hello], [Hello]]